iphone:performSelector:withObject:afterDelay:不能与后台线程一起使用?

sub*_*ero 7 iphone objective-c iphone-sdk-3.0

我想在后台线程中运行一个方法,第一个方法将在几秒钟后在同一个(后台)线程上运行另一个方法.我写了这个:

- (IBAction)lauch:(id)sender
{
    [self performSelectorInBackground:@selector(first) withObject:nil];

}
-(void) second {
    printf("second\n");
}
-(void) first {
    NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
    printf("first\n");

    [self performSelector:@selector(second) withObject:nil afterDelay:3];

    printf("ok\n");
    [apool release];
}
Run Code Online (Sandbox Code Playgroud)

但第二种方法从未被调用,为什么?而且,我怎么可以实现我的目标?

谢谢

bbu*_*bum 9

你必须有一个runningSelector的运行循环:withObject:afterDelay:工作.


您的代码执行,first并在first退出时,线程消失.您需要运行一个运行循环.

加:

[[NSRunLoop currentRunLoop] run];
Run Code Online (Sandbox Code Playgroud)

到最后first.

  • 我不明白,你怎么能没有运行循环? (2认同)
  • 你有一个运行循环,因为它们带有线程,但没有任何自动导致运行循环运行.您需要附加输入(例如"NSPort")或计时器才能实现.如果你想要一个刚刚运行的第二个运行循环,通常会在其运行循环中重复生成一个调用`runUntilDate:`的线程,直到出现退出条件. (2认同)