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

Posted

技术标签:

【中文标题】iphone:performSelector:withObject:afterDelay:不能与后台线程一起使用?【英文标题】:iphone: performSelector: withObject: afterDelay: does not work with a background thread? 【发布时间】:2010-08-31 23:11:24 【问题描述】:

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

- (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];

但是第二个方法永远不会被调用,为什么?还有,我怎样才能实现我的目标?

谢谢

【问题讨论】:

【参考方案1】:

您必须有一个运行循环才能使 performSelector:withObject:afterDelay: 工作。


您的代码执行first,当first 退出时,线程就消失了。你需要运行一个运行循环。

添加:

[[NSRunLoop currentRunLoop] run];

first结尾。

【讨论】:

哎哟......不。那应该是问题所在。谢谢! 我不明白,你怎么能没有运行循环? 我也不明白。这个答案能具体一点吗? 你有一个运行循环,因为它们带有线程,但没有任何东西自动导致运行循环运行。您需要附加输入(例如NSPort)或计时器才能实现。如果你想要一个刚刚运行的第二个运行循环,通常会孵化一个在其运行循环上反复调用runUntilDate: 的线程,直到出现退出条件。 回答了我自己的问题:来自 NSRunLoop 文档:If no input sources or timers are attached to the run loop, this method exits immediately; otherwise, it runs the receiver in the NSDefaultRunLoopMode by repeatedly invoking runMode:beforeDate:. In other words, this method effectively begins an infinite loop that processes data from the run loop’s input sources and timers. performselector:afterdelay: 在当前运行循环中添加了一个计时器。这需要在调用 run 之前完成

以上是关于iphone:performSelector:withObject:afterDelay:不能与后台线程一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone又爆Wi-Fi漏洞 中招Wi-Fi就废了

iPhone再曝出Wi-Fi漏洞 这次比之前的更加严重

碰上这种 Wi-Fi,iPhone 秒崩!

小心你的 WiFi 被禁用,iPhone 又出新Bug,附方法

iOS performSelector(参考)

performSelector的原理以及用法