无法从 iOS6 中的后台线程调用主线程上的代码
Posted
技术标签:
【中文标题】无法从 iOS6 中的后台线程调用主线程上的代码【英文标题】:Cannot invoke code on the main thread from the background thread in iOS6 【发布时间】:2012-10-23 15:19:02 【问题描述】:在后台线程上保存托管对象上下文时,我正在监听 NSManagedObjectContextDidSaveNotification 并尝试在主线程上合并它。
但是,当我尝试将请求转发到主线程时,没有使用任何代码执行
[self performSelectorOnMainThread:@selector(executeThisCode:) withObject:saveNotification waitUntilDone:NO];
也没有
dispatch_async(dispatch_get_main_queue(), ^
...execute this code
);
奇怪的是,这一切都适用于 ios 5.1 和 iOS 5.0,但不适用于 iOS 6。有什么想法吗?
【问题讨论】:
【参考方案1】:你首先检查你是否已经在主线程中?如果executeThisCode
是您在调用performSelectorOnMainThread
时当前正在执行的方法的选择器,这将特别相关。像这样的:
- (void) executeThisCode: (NSNotification*) notification
if (![NSThread isMainThread])
[self performSelectorOnMainThread:@selector(executeThisCode:)
withObject:notification
waitUntilDone:YES];
return;
// merge logic goes here and executes on the main thread
【讨论】:
您可以尝试使用 waitUntilDone:是吗?我注意到您已将其设置为 NO。以上是关于无法从 iOS6 中的后台线程调用主线程上的代码的主要内容,如果未能解决你的问题,请参考以下文章
从后台线程调用 startActivity 并且主线程被阻塞时,Activity 延迟启动