NSOperation & NSOperationQueue

  • NSOperation的做用
  • 配合使用NSOperationNSOperationQueue也能實現多線程編程
  • NSOperationNSOperationQueue實現多線程的具體步驟
  • 先將須要執行的操做封裝到一個NSOperation對象中
  • 而後將NSOperation對象添加到NSOperationQueue
  • 系統會自動將NSOperationQueue中的NSOperation取出來
  • 將取出的NSOperation封裝的操做放到一條新線程中執行
  • NSOperation的子類
  • NSOperation是個抽象類,並不具有封裝操做的能力,必須使用它的子類
  • 使用NSOperation子類的方式有3
  • NSInvocationOperation
  • NSBlockOperation
  • 自定義子類繼承NSOperation,實現內部相應的方法
  • NSInvocationOperation
  • 建立NSInvocationOperation對象

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;編程

  • 調用start方法開始執行操做

- (void)start;多線程

一旦執行操做,就會調用targetsel方法併發

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

+ (id)blockOperationWithBlock:(void (^)(void))block;異步

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

- (void)addExecutionBlock:(void (^)(void))block;spa

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

類比GCD:此時(任務)operation至關於GCD中的block,隊列queue至關於GCD中的隊列.隊列是什麼類型取決於任務放在哪一個線程執行,主線程就是主隊列,子線程就是全局併發對列orm

NSOperationQueue對象

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

- (void)addOperation:(NSOperation *)op;blog

- (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;

操做優先級

  • 設置NSOperationqueue中的優先級,能夠改變操做的執行優先級

- (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

  • 能夠在不一樣queueNSOperation之間建立依賴關係
相關文章
相關標籤/搜索