iOS多線程之NSOperation

1.簡介

1.1NSOperation的做用

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

1.2NSOperation和NSOperationQueue實現多線程的具體步驟

  •  先將須要執行的操做封裝到一個NSOperation對象中多線程

  •  而後將NSOperation對象添加到NSOperationQueue中併發

  •  系統會自動將NSOperationQueue中的NSOperation取出來異步

  •  將取出的NSOperation封裝的操做放到一條新線程中執行spa

2.NSOperation的子類

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

  •  使用NSOperation子類的方式有3種:code

     NSInvocationOperationorm

     NSBlockOperation對象

     自定義子類繼承NSOperation,實現內部相應的方法繼承

3.NSInvocationOperation

  •  建立NSInvocationOperation對象

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
  •  調用start方法開始執行操做

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

     默認狀況下,調用了start方法後並不會開一條新線程去執行操做,而是在當前線程同步執行操做

     只有將NSOperation放到一個NSOperationQueue中,纔會異步執行操做

4.NSBlockOperation

  •  建立NSBlockOperation對象

+ (id)blockOperationWithBlock:(void (^)(void))block;
  •  經過addExecutionBlock:方法添加更多的操做

- (void)addExecutionBlock:(void (^)(void))block;
注意:只要NSBlockOperation封裝的操做數 > 1,就會異步執行操做

5.NSOperationQueue

 5.1NSOperationQueue的做用

  •  NSOperation能夠調用start方法來執行任務,但默認是同步執行的

  •  若是將NSOperation添加到NSOperationQueue(操做隊列)中,系統會自動異步執行NSOperation中的操做

 5.2添加操做到NSOperationQueue中

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

6.最大併發數

  •  什麼是併發數

     同時執行的任務數

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

  •  最大併發數的相關方法

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

7.隊列的取消、暫停、恢復

  •  取消隊列的全部操做

- (void)cancelAllOperations;
提示:也能夠調用NSOperation的- (void)cancel方法取消單個操做
  •  暫停和恢復隊列

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

8.操做優先級

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

- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
  •  優先級的取值

  NSOperationQueuePriorityVeryLow = -8L, 
  NSOperationQueuePriorityLow = -4L, 
  NSOperationQueuePriorityNormal = 0, 
  NSOperationQueuePriorityHigh = 4, 
  NSOperationQueuePriorityVeryHigh = 8

9.操做依賴

  •  NSOperation之間能夠設置依賴來保證執行順序

     好比必定要讓操做A執行完後,才能執行操做B,能夠這麼寫

[operationB addDependency:operationA]; // 操做B依賴於操做A
能夠在不一樣queue的NSOperation之間建立依賴關係

10.操做的監聽

 能夠監聽一個操做的執行完畢 
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

11.自定義NSOperation

  •  自定義NSOperation的步驟很簡單

     重寫- (void)main方法,在裏面實現想執行的任務

  •  重寫- (void)main方法的注意點

     本身建立自動釋放池(由於若是是異步操做,沒法訪問主線程的自動釋放池)

     常常經過- (BOOL)isCancelled方法檢測操做是否被取消,對取消作出響應

相關文章
相關標籤/搜索