5

在这件事上扯出我的头发,任何想法或建议将不胜感激。

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

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

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

4

2 回答 2

3

performSelectorOnMainThread:withObject:waitUntilDone 有时会很奇怪。你有没有想过尝试使用 lib 调度?

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

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

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

于 2011-10-27T19:48:01.657 回答
0

一个线程RunLoop有几种不同的模式。在您进行调用期间,主线程可能以不同于默认模式的模式运行(这是performSelectorOnMainThread:withObject:WaitUntilDone:.

考虑使用performSelectorOnMainThread:withObject:waitUntilDone:modes:
See Apple 的文档

另外 - GCD (libdispatch) 很棒,但它不会保护你免于陷入死锁:考虑你的方法在主线程上运行并且你正在调用的情况:

dispatch_sync(dispatch_get_main_queue(), ^{
    <do work here>
});
于 2015-10-01T04:16:11.770 回答