在此撕裂我的头发,任何想法或建议将不胜感激。
我有一个从子线程调用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上)。
我真的不知道在哪里看。我告诉它要执行它,它通常在几乎每个设备上都有,但同一行没有响应,没有错误等等...
答案 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>
});