2013-02-21 31 views
4

我剛開始使用NSOperation/NSOprationQueue,所以原諒我問這個問題。 :PNSOperationQueue使用新線程在內部操作開始的併發操作

在我的應用程序開始時,我想要在隊列中執行一些函數集,這樣當一個結束時,另一個開始(我已將setMaxConcurrentOperationCount設置爲1,以便一次只發生一個操作)。所有這些都應該發生在後臺,作爲一種下載/上傳到服務器的信息。

我把第一個操作放在隊列中,調用另一個方法,這可能會調用一些新線程來執行一些其他操作。

我的問題是, 在開始第二次操作之前,操作隊列是否等待第一次操作中啓動的所有方法/線程完成?

回答

1

有兩種NSOperation s,併發和非併發。

非併發操作在它們的-main方法中實現,當此方法返回時,操作被視爲完成。如果您在-main內部生成了一個線程,並且希望該操作一直運行到線程完成,則應該在-main之前阻止執行,直到線程完成爲止(例如使用信號量)。

併發操作有一組謂詞,如-isExecuting-isFinished,並且有一個啓動操作的-start方法。這種方法可能只是產生一些後臺處理並立即返回,整個操作不被視爲完成,直到-isFinished這麼說。

現在我們已經GCD它通常是一個好主意,考慮塊和調度隊列爲NSOperation較輕的替代方案,也看到了–addOperationWithBlock:方法上NSOperationQueue

0

如果NSOperation正在執行異步任務,如[NSURLConnection sendAsynchronousRequest:.....]比正在運行的線程不會等待響應,並且不會等待。一旦主方法的最後一條語句或塊最後一條語句被執行,操作將從隊列中移除並且下一個操作將開始。

0

您可以使用類似這樣

NSOperationQueue *queue=[NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{ 
    //operation first 
}]; 
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{ 
    //operation second 
}]; 
[blockOperation2 addDependency:blockOperation1]; 
[queue addOperation:blockOperation1]; 
[queue addOperation:blockOperation2];