2011-03-10 41 views
8

例如,在GKScorereportScoreWithCompletionHandlerdocumentation),假設你叫在哪個線程中調用iOS完成處理程序塊?

[score reportScoreWithCompletionHandler:^(NSError *error) { 
    // do some stuff that may be thread-unsafe 
}]; 

在哪個線程將完成處理程序被調用:主線程,同一個線程reportScoreWithCompletionHandler是所謂的,或不同的線程(大概是實際分數報告完成的線程)?

換句話說,在完成處理程序中完成的工作是否必須是線程安全的(就像在哪個線程中執行什麼線程無關)?

回答

6

實際上並不重要。

如果您需要完成在主線程中運行,只需將其分派到主線程:

[score reportScoreWithCompletionHandler:^(NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do your stuff here 
    }); 
}]; 
+0

有趣。這是否與運行循環完美交錯? (也就是說,當完成處理程序被調用時,調度的任務是否會在下次運行循環迭代之前被調用,或者是否會有一些延遲?) – 2011-03-11 00:21:10

+0

我認爲主線程runloop將處理排隊的塊作爲正常事件的一部分處理週期。所以它應該「很快」發生,但與所有與runloop相關的事情一樣,時序不保證。 – mlaster 2011-03-11 03:38:59

相關問題