iOS NSOperation的基本使用

weixin_34248705發表於2017-05-30

NSOperation的作用:

配合使用NSOperation和NSOperationQueue也能實現多執行緒程式設計

NSOperation和NSOperationQueue實現多執行緒的具體步驟:

先將需要執行的操作封裝到一個NSOperation物件中

然後將NSOperation物件新增到NSOperationQueue中

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

將取出的NSOperation封裝的操作放到一條新執行緒中執行


NSOperation的子類

NSOperation是個抽象類,並不具備封裝操作的能力,必須使用它的子類

使用NSOperation子類的方式有3種

1.NSInvocationOperation

2.NSBlockOperation

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


NSInvocationOperation:

建立NSInvocationOperation物件

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

呼叫start方法開始執行操作

- (void)start;

一旦執行操作,就會呼叫target的sel方法

注意

預設情況下,呼叫了start方法後並不會開一條新執行緒去執行操作,而是在當前執行緒同步執行操作

只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作

-(void)invocationOpeation

{

//1.建立操作,封裝任務

/*

第一個引數:目標物件self

第二個引數:呼叫方法的名稱

第三個引數:前面方法需要接受的引數nil

*/

NSInvocationOperation*op1 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download1)object:nil];

NSInvocationOperation*op2 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download2)object:nil];

NSInvocationOperation*op3 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download3)object:nil];

//2.啟動|執行操作

[op1start];

[op2start];

[op3start];

}


NSBlockOperation:

建立NSBlockOperation物件

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

通過addExecutionBlock:方法新增更多的操作

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

注意:只要NSBlockOperation封裝的運算元 > 1,就會非同步執行操作


-(void)blockOperation//1.建立操作

NSBlockOperation*op1 = [NSBlockOperationblockOperationWithBlock:^{

NSLog(@"1----%@",[NSThreadcurrentThread]);

}];

NSBlockOperation*op2 = [NSBlockOperationblockOperationWithBlock:^{

NSLog(@"2----%@",[NSThreadcurrentThread]);

}];

NSBlockOperation*op3 = [NSBlockOperationblockOperationWithBlock:^{

NSLog(@"3----%@",[NSThreadcurrentThread]);

}];

//追加任務

//注意:如果一個操作中的任務數量大於1,那麼會開子執行緒併發執行任務

//注意:不一定是子執行緒,有可能是主執行緒

[op3addExecutionBlock:^{

NSLog(@"4---%@",[NSThreadcurrentThread]);

}];

[op3addExecutionBlock:^{

NSLog(@"5---%@",[NSThreadcurrentThread]);

}];

[op3addExecutionBlock:^{

NSLog(@"6---%@",[NSThreadcurrentThread]);

}];

//2.啟動

[op1start];

[op2start];

[op3start];

}


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之間可以設定依賴來保證執行順序

比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫

[operationB addDependency:operationA]; // 操作B依賴於操作A

可以在不同queue的NSOperation之間建立依賴關係


5691522-9ad56a1af3aa0bbe.png

可以監聽一個操作的執行完畢

- (void (^)(void))completionBlock;

- (void)setCompletionBlock:(void (^)(void))block;


自定義NSOperation的步驟很簡單

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

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

自己建立自動釋放池(因為如果是非同步操作,無法訪問主執行緒的自動釋放池)

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


相關文章