2013-05-10 50 views
5

我有一個數據加載操作,需要從主線程運行,以避免潛在的阻塞問題。爲此,我使用NSOperationQueue和NSOperations。如何在NSOperationQueue完成之前阻止NSOperation?

然而,出現的一個問題是,其中一個操作存在根據傳入信息產生附加操作。試圖解決這個問題也解決了我在別處遇到的一些小問題,因爲我碰到的解決方案是給NSOperation它是自己的子任務隊列。

問題是,只要'main'退出,NSOperation將被標記爲'finished',而不管子隊列是否已經完成處理;我如何覆蓋這種行爲?

+0

聽起來像你正在尋找[併發'NSOperation'](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html)? – 2013-05-10 03:00:34

+0

@CarlVeazey不......確切地說,但它看起來像用於創建一個併發NSOperation的步驟做同樣的事情,我實際上在尋找。你必須重寫啓動方法如何處理isFinished/isExecuting,我認爲這正是我需要在這裏做的。我需要覆蓋啓動,因此它不會設置isFinished即時主要目的。這意味着當我改變這些屬性時,處理KVO的東西,哦,快樂。 – RonLugge 2013-05-10 03:11:42

+0

@CodaFi我不確定自己是否清楚自己,但你提出的答案似乎沒有道理。依賴性阻止了一個操作的執行,它不會阻止它在開始執行時完成。至少,這就是參考文獻所說的。 – RonLugge 2013-05-10 03:53:24

回答

1

在退出操作主方法之前,您可以發送waitUntilAllOperationsAreFinished消息到您的子隊列。這很容易,但不是一個好主意,因爲它阻止了整個線程,而這非常浪費。

更好的解決方案是使用依賴系統。創建與您的主要操作有關的另一個操作。創建子操作之後,還可以將它們作爲依賴項添加到新的「精加工」操作中。

1

只要「主」退出,的NSOperation將被標記爲「完成」,

這個邏輯在[NSOperation start]實現的,所以你只要用您的定製邏輯來覆蓋它:調用main,它產生一些額外的操作,在完成操作後設置狀態isFinished

相關問題