在 iOS 上,我想知道是否有任何类似于 NSZombies 标志的东西可以设置为在需要主线程时从后台线程调用 API 时检测/引发。
对于块,似乎很容易陷入这样一种情况,即人们要么做出错误的假设,要么错误地判断哪个线程正在做什么。可以检测何时从错误线程进行调用的调试标志对于查找这些情况非常有用。
我主要关心的是Apple的框架(Cocoa Touch)。
提交了错误报告,#12180446。
在 iOS 上,我想知道是否有任何类似于 NSZombies 标志的东西可以设置为在需要主线程时从后台线程调用 API 时检测/引发。
对于块,似乎很容易陷入这样一种情况,即人们要么做出错误的假设,要么错误地判断哪个线程正在做什么。可以检测何时从错误线程进行调用的调试标志对于查找这些情况非常有用。
我主要关心的是Apple的框架(Cocoa Touch)。
提交了错误报告,#12180446。
在需要在主线程上的任何 API 中使用以下内容:
NSAssert([NSThread isMainThread], @"This must only be called on the main thread.");
Apple 没有提供这样一个涵盖所有 UIKit 的东西。您需要在需要时调用它。
我做一些更实际的事情。当我调用块时。我用自定义方法来做。
+ (void) ensureDispatchOfBlock:(dispatch_block_t) block onQueue:(dispatch_queue_t) queue async:(BOOL) async{
if (queue == nil || dispatch_get_current_queue() == queue){
block();
}
else {
if (async){
dispatch_async(queue, block);
}
else {
dispatch_sync(queue, block);
}
}
}
+ (void) ensureDispatchOnMainThread:(dispatch_block_t) block async:(BOOL) async{
[self ensureDispatchOfBlock:block onQueue:dispatch_get_main_queue() async:async];
}
这使我能够“确保”正在提供的块的调度将在其预期的块上发生。
请记住async:NO
非常谨慎地使用。