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 委托调用完成处理程序。
在我的应用程序中,我使用以下方法检查某些变量的值,这些变量只能在主线程上访问。
现在我开始实施 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 委托调用完成处理程序。