2016-01-24 272 views
3

最近,我正在學習併發在迅速。根據蘋果的文檔中NSOperation class reference是在異步同步異步

當你添加一個操作到操作隊列,隊列會忽略異步屬性的值,並總是調用從一個單獨的線程啓動方法。因此,如果您始終通過將操作添加到操作隊列來運行操作,則沒有理由使它們異步。

是不是意味着同步在一個單獨的線程中是異步的?當我用下面的代碼進行測試時,操作確實不會阻塞當前的主線程。

let operationQueue = NSOperationQueue() 
let operation = NSBlockOperation(){ 
    //do some task here 
} 
operationQueue.addOperation(operation) 

所以如果它是真的,那麼我們爲什麼要創建NSOperation的併發子類呢?

回答

1

異步總是相對於發出請求的線程定義的。因此,如果線程A在線程B中運行請求,以便線程A能夠在線程B運行請求時執行其他工作,則請求與線程A是異步的。

如果反過來農場線程B出請求線程C-使得線程B能夠同時線程C-運行請求做其他工作,然後該第二請求是異步相對於螺紋B.

它當然,不要一次又一次地反覆地重複同樣的工作元素。但是,假設上述線程A委託給線程B的工作可以分解爲多個較小的工作元素。線程B在線程C,D等上異步調用這些較小的工作元素是合理的。如果B向A提供服務使得A不想/不需要知道工作的細節完成;它只是想要異步完成工作。 B知道細節,並可以決定是否/如何通過較小的並聯裝置完成工作。

2

哦,NSOperation。你有這樣奇怪的歷史。

NSOperation相對較舊(用iOS術語來說;在ObjC術語中相當現代)。它被添加到OS X 10.5中。在OS X 10.6/iOS 4之前,沒有NSBlockOperation對象。根本沒有任何障礙。所以做手術的唯一方法是繼承或使用NSInvocationOperation。兩種方法都很麻煩,但比直接使用NSThread的舊方法更容易和更強大。 (這是正確的時候,多核心成爲了一件事情,10.5着名的是增加了Core Animation,這是我相信Cocoa中第一個主要的搶先式多任務框架。在10.5之前,大多數事情都是通過runloop來完成的,協同式多任務,這對於單核系統來說實際上是非常有效和高效的,但是它並沒有很好地適應多核系統,提供了像NSOperation這樣的工具來幫助我們編寫更好的多核代碼,但是GCD是,所以功能更強大,它完全支配Cocoa中多任務代碼的編寫方式)。

當您將NSOperation子類化時,您需要告訴系統您的操作是否爲asy nchronous。這不是異步運行你的請求。這是承諾您的start方法不會阻止。這取決於您的start方法以確保操作確實是異步的。

這只是在您的NSOperation正在手動啓動的情況下才需要,即使此時通常不需要。如果你把它放到NSOperationQueue(你真的應該總是這樣做),這個屬性是無關緊要的。我記得當時造成了很多混亂。

自引入塊以來,它變得更加無關緊要。使用NSBlockOperation(或dispatch_async)幾乎總是比使用子類NSOperation容易得多,因爲要得到正確的結果總是有點棘手。

爲防萬一你還沒有讀過它,如果你想研究Cocoa併發性,你一定要從Concurrency Programming Guide開始。

+0

真的很感謝。如果我理解正確,你的意思是同步在一個單獨的線程確實是異步。實際上,使用'NSOperationQueue'時不需要改變異步屬性。 – rrrain

+0

兩個計數都正確。 –