performSelectorOnMainThread不执行

时间:2011-10-27 19:20:35

标签: iphone ios multithreading performselector

在此撕裂我的头发,任何想法或建议将不胜感激。

我有一个从子线程调用performSelectorOnMainThread:withObject:waitUntilDone:的对象。这在95%的时间都可以正常工作。自从iOS测试版以后,每隔一段时间,设备就会拒绝执行performSelectorOnMainThread:withObject:waitUntilDone:调用...没有错误消息,它不会崩溃,我无法让设备进入状态它“失败”的地方但是一旦它出现它继续失败,直到我删除并重新安装应用程序,或强制它退出,然后调整它的位置服务限额,然后再次启动它,然后再次重新调整它的位置服务恢复正常...重启设备无法解决问题。不首先删除重新安装不会修复它。这很奇怪....我知道它大部分时间都有效,因为大多数设备都没有问题,但是有些设备会有规律地失败(可能每3或4天)。我知道具体是performSelectorOnMainThread:withObject:waitUntilDone:没有调用它应该是什么,因为我现在有一个失败的设备,并且我已经将NSLog放入应该被调用的方法中。它运行正常,但在失败的设备上,当performSelectorOnMainThread:withObject:waitUntilDone:用于调用该方法时,NSLog显示它没有运行...

这开始发生在iOS 5测试版上,并在发布时再次发生。它最常出现在我的两台设备上,但在我亲自测试的其他10台设备上都没有。我认为它只是我的设备,来自测试中的一些打嗝,但它发生在我的全新4S上,从未触及测试版,以及一个用户的iPad 2(不在我的iPad 2上)。

我真的不知道在哪里看。我告诉它要执行它,它通常在几乎每个设备上都有,但同一行没有响应,没有错误等等...

2 个答案:

答案 0 :(得分:3)

performSelectorOnMainThread:withObject:waitUntilDone有时会很糟糕。你有没有想过尝试使用lib dispatch?

您可以创建一个块并将其发布到主线程上,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
    <do work here>
});

这与使用performSelectorOnMainThread:withObject:waitUntilDone 具有相同的保存效果 http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

答案 1 :(得分:0)

线程的RunLoop有几种不同的模式。 在您拨打电话的过程中,主线程可能以不同于默认模式的模式运行(performSelectorOnMainThread:withObject:WaitUntilDone:定位的模式。

考虑使用performSelectorOnMainThread:withObject:waitUntilDone:modes:
请参阅Apple's documentation

此外 - GCD(libdispatch)非常棒,但它不能保护你免于陷入僵局: 考虑一下你的方法在主线程上运行并且你正在调用的情况:

dispatch_sync(dispatch_get_main_queue(), ^{
    <do work here>
});