2012-08-23 124 views
0

在iOS上,我想知道是否有任何类似于NSZombies标志,可以设置为检测/提高当主线程需要时从后台线程调用API。iOS线程违规检测?

对于块,似乎很容易陷入一种情况,即人们对于哪个线程正在做什么做出错误的假设或错误。一个调试标志可以检测何时由错误的线程进行调用对于查找这些情况非常有用。

这主要是苹果的关注我的框架(Cocoa Touch)。

提交了一个错误报告#12180446。

回答

2

使用以下的要求是在主线程您的任何API:

NSAssert([NSThread isMainThread], @"This must only be called on the main thread."); 

苹果不提供涵盖所有的UIKit这样的事情。您需要时可以打电话给他。

+0

这主要是我关心的Apple框架。 – xyzzycoder

+0

是的,但在你打电话之前先检查一下。没有可用的全局UIKit级别断言。如果你认为你需要它,你应该在bugreport.apple.com上打开雷达。他们不太可能添加它,因为它需要遍布各处(在最简单的实现中产生运行时成本,而且在免费实现中维护非常复杂)。但是,您请求的方式是通过bugreport.apple.com。与此同时,您需要的时候添加此断言。 –

+0

我认为可以用相同的论据来支持NSZombies。通过消除内存管理(ARC),微妙的编码错误(静态分析器),增强编译器消息等问题,Apple正在投入大量精力来增强开发人员工具并降低成本。有能力捕捉到呼叫时从后台线程创建一个需要主线程的API将非常有用。苹果很聪明。我敢打赌,他们可以找出一种不麻烦的方式。 – xyzzycoder

1

我做了一些更实际的事情。当我叫块。我用自定义方法来做。

+ (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