在iOS上,我想知道是否有类似NSZombies标志的东西可以设置为在需要主线程时从后台线程调用API时检测/提升。
对于块,似乎很容易陷入这样一种情况,即对哪个线程正在做什么做出错误的假设或错误。调试标志可以检测何时从错误的线程进行调用,这对于查找这些情况非常有用。
我关心的主要是苹果的框架(Cocoa Touch)。
提交了一份错误报告,编号12180446。
在任何需要在主线程上的API中使用以下内容:
NSAssert([NSThread isMainThread], @"This must only be called on the main thread.");
苹果并没有提供这样一个涵盖所有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
即可。