GCD和NSOperation的區別
一、GCD是一種輕量級的方法來實現多線程。控制起來比較麻煩,好比取消和暫停一個線程。
二、NSOperation和NSOperationQueue相對於GCD效率上要低一點,他們是面向對象的方式,從Mac OS X v10.6和iOS4開始,NSOperation底層也是用的GCD來實現的。能夠在多個操做中添加附屬,也能夠重用操做,取消或者暫停。NSOperation和KVO是兼容,也就是說,能夠在NSOperation中使用KVO,例如,你能夠經過NSNotificationCenter去讓一個操做開始執行。ios
三、NSOperation的使用方法
【1】、繼承NSOperation類
【2】、重寫「main」方法
【3】、在「main」方法中建立一個autoreleasepool
【4】、將本身的代碼放在autoreleasepool中
注意:建立自動釋放池的緣由是,你不能訪問主線程的自動釋放池,因此須要本身建立一個。git
四、NSOperation的經常使用方法
【1】、start:開始方法,當把NSOperation添加到NSOperationQueue中去後,隊列會在操做中調用start方法。
【2】、addDependency,removeDependency:添加從屬性,刪除從屬性,好比說有線程a,b,若是操做a從屬於b,那麼a會等到b結束後纔開始執行。
【3】、setQueuePriority:設置線程的優先級。例:[a setQueuePriority:NSOperationQueuePriorityVeryLow];一共有四個優先級:NSOperationQueuePriorityLow,NSOperationQueuePriorityNormal,NSOperationQueuePriorityHigh,NSOperationQueuePriorityVeryHigh。
當你添加一個操做到一個隊列時,在對操做調用start以前,NSOperationQueue會瀏覽全部的操做,具備較高優先級的操做會優先執行,具備相同優先級的操做會按照添加到隊列中順序執行。
【4】、setCompletionBlock:設置回調方法,當操做結束後,會調用設置的回調block。這個block會在主線程中執行。github
示例代碼:https://github.com/chenjiang3/ios-demo/tree/master/ClassicPhotos多線程