无法从 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 中的后台线程调用主线程上的代码的主要内容,如果未能解决你的问题,请参考以下文章

即使从主线程调用更新,UI 也不会更新

从后台线程调用 startActivity 并且主线程被阻塞时,Activity 延迟启动

后台线程中的 moya 请求

为啥我从后台工作人员调用的委托在主线程中运行

调用异步方法后,进程似乎没有回到 WPF 应用程序中的主线程

在从主线程访问后,不得从后台线程对 > 布局引擎进行修改