基本使用
NSInvocationOperation
NSInvocationOperation op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
// 創(chuàng)建隊列
/
GCD:
串行類型: create & 主隊列
并發(fā)類型: create & 全局并發(fā)隊列
NSOperation:
主隊列(串行隊列): [NSOperationQueue MainQueue] 和 GCD主隊列一樣
非主隊列: [[NSOperationQueue alloc] init] 非常特殊(同時具備并發(fā)和串行的功能) (默認情況下是并發(fā)隊列)
*/
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 將操作添加到隊列中
[queue addOperation:op]; // 內(nèi)部已經(jīng)調(diào)用了start方法-
NSBlockOperation
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
}];
// 追加任務(wù) (一個操作對象包含一個以上任務(wù) 可能會開啟子線程并發(fā)執(zhí)行任務(wù))
[op addExecutionBlock:^{
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];// 簡便方法 [queue addOperationWithBlock:^{ }];
-
自定義NSOperation
// 自定義操作類繼承自NSOperation 重寫main方法
#import "SWOperation.h"
@implementation SWOperation
// 要執(zhí)行的任務(wù)
-(void)main
{
}
@end// 調(diào)用該自定義操作類 即可實現(xiàn)并發(fā)操作 SWOperation *op = [[SWOperation alloc] init]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op];
NSOperation其他用法(暫停/恢復/取消/最大并發(fā)數(shù))
最大并發(fā)數(shù)(默認值為-1,表示最大值)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 最大并發(fā)數(shù)(同一時間最多有多少個任務(wù)可以執(zhí)行) 并發(fā)數(shù)為1時為串行執(zhí)行(注:串行不代表只開一條線程)
queue.maxConcurrentOperationCount = 1;-
暫停/恢復/取消
// 暫停 (不能暫停當前正在執(zhí)行的任務(wù) 暫停后隊列中未執(zhí)行的任務(wù)會停止執(zhí)行)
queue.suspended = YES;
// 恢復
queue.suspended = NO;
// 取消
[queue cancelAllOperations];// 自定義類的暫停/恢復/取消 #import "SWOperation.h" @implementation SWOperation // 要執(zhí)行的任務(wù) -(void)main { for (int i = 0; i < 1000; i++) { NSLog(@"download1---%d---%@",i,[NSThread mainThread]); } // 點擊取消 會自動調(diào)用cancel方法 判斷是否取消 若取消 則退出 if (self.isCancelled) { return; } for (int i = 0; i < 1000; i++) { NSLog(@"download1---%d---%@",i,[NSThread mainThread]); } } @end
操作依賴
// 操作1依賴于操作2 (不能循環(huán)依賴)
// 可以跨隊列依賴
[op1 addDependency:op2];操作監(jiān)聽
// 操作監(jiān)聽
[op1 setCompletionBlock:^{
// op1操作執(zhí)行完畢
}];
NSOperation線程間通訊
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
// 執(zhí)行耗時操作
// 回主線程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 更新UI
}];
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];