NSOperationQueue

NSOperation的做用 配合使用NSOperation和NSOperationQueue也能實現多線程編程git

NSOperation和NSOperationQueue實現多線程的具體步驟 先將須要執行的操做封裝到一個NSOperation對象中 而後將NSOperation對象添加到NSOperationQueue中 系統會自動將NSOperationQueue中的NSOperation取出來 將取出的NSOperation封裝的操做放到一條新線程中執行github

NSOperation是個抽象類,並不具有封裝操做的能力,必須使用它的子類編程

使用NSOperation子類的方式有3種 NSInvocationOperation NSBlockOperation 自定義子類繼承NSOperation,實現內部相應的方法緩存

建立NSInvocationOperation對象網絡

  • (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

調用start方法開始執行操做多線程

  • (void)start; 一旦執行操做,就會調用target的sel方法

注意 默認狀況下,調用了start方法後並不會開一條新線程去執行操做,而是在當前線程同步執行操做 只有將NSOperation放到一個NSOperationQueue中,纔會異步執行操做併發

建立NSBlockOperation對象框架

  • (id)blockOperationWithBlock:(void (^)(void))block;

經過addExecutionBlock:方法添加更多的操做異步

  • (void)addExecutionBlock:(void (^)(void))block;

注意:只要NSBlockOperation封裝的操做數 > 1,就會異步執行操做線程

任務剛執行玩的時候,線程有一個會收到線程池,再拿出來使用的過程 ,因此這個時候,線程池裏若是還有其餘線程,就直接拿來使用

NSOperationQueue的做用 NSOperation能夠調用start方法來執行任務,但默認是同步執行的 若是將NSOperation添加到NSOperationQueue(操做隊列)中,系統會自動異步執行NSOperation中的操做

添加操做到NSOperationQueue中

  • (void); addOperation:(NSOperation *)op
  • (void)addOperationWithBlock:(void (^)(void))block;

什麼是併發數 同時執行的任務數 好比,同時開3個線程執行3個任務,併發數就是3

最大併發數的相關方法

  • (NSInteger)maxConcurrentOperationCount;
  • (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

取消隊列的全部操做

  • (void)cancelAllOperations; 提示:也能夠調用NSOperation的- (void)cancel方法取消單個操做

暫停和恢復隊列

  • (void)setSuspended:(BOOL)b; // YES表明暫停隊列,NO表明恢復隊列
  • (BOOL)isSuspended;

設置NSOperation在queue中的優先級,能夠改變操做的執行優先級

  • (NSOperationQueuePriority)queuePriority;
  • (void)setQueuePriority:(NSOperationQueuePriority)p;

優先級的取值 NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8

能夠監聽一個操做的執行完畢

  • (void (^)(void))completionBlock;
  • (void)setCompletionBlock:(void (^)(void))block;

NSOperation之間能夠設置依賴來保證執行順序 好比必定要讓操做A執行完後,才能執行操做B,能夠這麼寫 [operationB addDependency:operationA]; // 操做B依賴於操做A

能夠在不一樣queue的NSOperation之間建立依賴關係

什麼是SDWebImage iOS中著名的牛逼的網絡圖片處理框架 包含的功能:圖片下載、圖片緩存、下載進度監聽、gif處理等等 用法極其簡單,功能十分強大,大大提升了網絡圖片的處理效率 國內超過90%的iOS項目都有它的影子

項目地址 https://github.com/rs/SDWebImage

自定義NSOperation的步驟很簡單 重寫- (void)main方法,在裏面實現想執行的任務

重寫- (void)main方法的注意點 本身建立自動釋放池(由於若是是異步操做,沒法訪問主線程的自動釋放池) 常常經過- (BOOL)isCancelled方法檢測操做是否被取消,對取消作出響應

相關文章
相關標籤/搜索