2011-10-27 33 views
5

撕裂我的头发在这,任何想法或建议将不胜感激。performSelectorOnMainThread不会执行

我有一个对象从子线程调用performSelectorOnMainThread:withObject:waitUntilDone:本身。这95%的时间工作正常。从iOS beta版开始,现在进入发行版,每隔一段时间,设备将拒绝执行performSelectorOnMainThread:withObject:waitUntilDone:调用...没有错误消息,它不会崩溃,我不能让设备进入“失败“但一旦它在那里,它会继续失败,直到我删除并重新安装应用程序,或强制它退出,然后调整它的位置服务补贴,然后再次启动它,然后再次将其位置服务重新调整为正常。 ..重新启动设备不能解决它。重新安装而不先删除不会修复它。这很奇怪....我知道它大部分时间工作,因为大多数设备没有问题,但是有些设备会有规律地失败(每隔3或4天)。我知道performSelectorOnMainThread:withObject:waitUntilDone:并不是在调用它应该的,因为我现在有一个失败的设备,并且我已经将NSLog放入了应该调用的方法。它功能正常,但在失败的设备上,当使用performSelectorOnMainThread:withObject:waitUntilDone:调用该方法时,NSLog显示它没有运行...

这开始发生在iOS 5 beta版本上,并且在发布时会发生。它经常发生在我的两台设备上,但是我没有亲自测试过其他10台设备。我认为这只是我的设备在测试版中的一些问题,但它发生在我从未接触过测试版的全新4S以及用户的一款iPad 2上(不在我的iPad 2上)。

我真的不知道去哪里看。我告诉它执行,它通常在几乎所有设备上执行,但同一行在某些情况下没有响应并且没有错误等...

+0

是你有任何机会使用CoreData?我有类似的问题。真正发生的是线程死锁,等待使用CoreData执行读取操作,而另一个线程正在尝试写入。 – picciano

+0

@picciano你是如何解决这个问题的?我遇到同样的问题,无法弄清楚我需要做什么来解决僵局。 –

回答

3

performSelectorOnMainThread:withObject:waitUntilDone有时可能无法使用。你有没有想过试图使用lib调度?

您可以创建一个块,并张贴这样在主线程:

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

0

线程的RunLoop有几种不同的模式。 有可能在时间,你打吧主线程比默认的(这是一个由performSelectorOnMainThread:withObject:WaitUntilDone:针对不同的模式运行。

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

此外 - GCD(libdispatch)是真棒,但它不会保护你自己做饭死锁: 考虑您的方法是在主线程上运行的情况下和你打电话:

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