2012-12-13 45 views
2

我想在當前執行的線程上同步執行一個NSOperation。我可以打電話給[NSOperation開始]嗎?這是否總是在當前正在執行的線程中運行?如果使用[NSOperation start]手動執行,哪個線程會運行NSOperation?

另一種方法是隻創建一個NSOperationQueue,添加操作然後調用waitUntilAllOperationsFinished選擇器。

+0

我不知道你是否能在當前隊列同步運行(除非它是一個隊列允許併發操作),你能嗎?如果您在主隊列中並要求它同步執行某些操作(即等待它),則可以阻止主隊列。你能澄清嗎? – Rob

回答

3

如果您致電[NSOperation start],它將在當前線程上同步執行。所有圍繞操作的異步工作都由NSOperationQueue處理,但如果您自己打電話給-start,那麼您就繞過了所有這些。

當然,可以實現一個特定的子類,以在另一個線程上產生異步任務本身;這完全取決於它。但是,如果您調用-start,那麼旨在在操作隊列運行的任何線程中同步執行的操作也將在您的線程中同步執行。


例如,下面的代碼,運行時:

NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"operation"); 
}]; 
[op start]; 
NSLog(@"complete"); 

打印:

operation 
complete 
+0

你是否有任何說明情況的參考?具體來說,它運行在「當前線程」上,我在其他地方看到它在主線程上運行,而不是當前線程。 – aloo

+0

@aloo:你在哪看到的?因爲這是完全錯誤的。無論如何,文檔指出:「此方法的默認實現更新操作的執行狀態並調用接收方的主要方法。」 '-main'用於非併發任務,例如只是同步運行的任務。 –

+0

非常感謝 - 在這裏看到:「如果你在一個NSOperation的實例上調用」start「,而不將它添加到隊列中,操作將在主循環中運行。」從:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues – aloo