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