iOS ObjC:当应用程序在后台接收 APNs 提取时,为什么 mainThread 上的 dispatch_sync 不工作?

iOS ObjC: Why is dispatch_sync on mainThread not working while app is in background receiving an APNs fetch?

在我的应用程序中,我使用以下方法检查某些变量的值,这些变量只能在主线程上访问。

现在我开始实施 APNs,当我的应用程序被 APNs 唤醒时,代码执行(在后台)似乎总是停留在使用注释指示的点:

- (void) xttSyncOnMainThread:(void (^)(void))prmBlock {
    if (![NSThread isMainThread]) {
        dispatch_queue_t mtQueue = dispatch_get_main_queue(); // will be executed
        // execution is stuck here
        dispatch_sync(mtQueue, prmBlock); // won't be executed
    } else {
        prmBlock();
    }
}

我是否需要将所有代码移至非 MT 队列,还是我遗漏了其他内容?

非常感谢!

因为 dispatch_sync 在主队列上导致死锁。

有关 dispatch_sync 和主队列的更多信息,例如:

dispatch_sync on main queue hangs in unit test

Why dispatch_sync( ) call on main queue is blocking the main queue?

你可以只使用 dispatch_async 方法吗?

 - (void) xttSyncOnMainThread:(void (^)(void))prmBlock {

    dispatch_async(dispatch_get_main_queue(), ^{
    //code here to perform
    }); 
 }

为什么要将 prmBlock 传递给 dispatch_sync

通常就像

dispatch_sync(dispatch_get_main_queue(), ^(void) {
        // write the code that is to be executed on main thread
});

但是如果你使用disptch_sync它会等待块完成执行然后return。如果您不想阻止执行,请使用

dispatch_async(dispatch_get_main_queue(), ^(void) {
        // write the code that is to be executed on main thread
});

好的,经过更多测试后,我发现在我的情况下(虽然问题中的代码工作得很好)问题来自意外过早地从 APNs 委托调用完成处理程序。