NSOperation和GCD很類似
NSOperation的作用
- 配合使用NSOperation 和 NSOperationQueue也能實(shí)現(xiàn)多線程編程
NSOperation和NSOperationQueue實(shí)現(xiàn)多線程的具體步驟
- 現(xiàn)將需要執(zhí)行的操作封住到一個(gè)NSOperation對象中
- 然后將NSoperation對象添加到NSOperationQueue中
- 系統(tǒng)會(huì)自動(dòng)將NSOperationQueue中的NSOperation取出來
- 然后將NSOperation中封裝的操作放到一個(gè)線程中執(zhí)行
NSOperation是一個(gè)操作類它的的子類才有封裝操作的能力
- NSInvocationOperation
- NSBlockOperation
- 自定義繼承NSOperation的子類
創(chuàng)建NSOperation 前兩種種方式其實(shí)作用一樣 只是一個(gè)Block 一個(gè)target調(diào)用
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(操作的方法) object:nil];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作
}];
隊(duì)列的類型
- 主隊(duì)列
- [NSOperationQueue mainQueue];
- 添加到"主隊(duì)列"中的操作,都會(huì)放到主線程中執(zhí)行
- 非主隊(duì)列
- [[NSOperationQueue alloc] init];
- 添加到"非主隊(duì)列"中的操作,都會(huì)放到子線程中執(zhí)行
隊(duì)列添加任務(wù)
- -(void)addOperation:(NSOperation *)op;
- -(void)addOperationWithBlock:(void(^)(void))block;
上代碼
情景一 、封裝一個(gè)NSOperation操作, 直接調(diào)用start方法,
分析: 主線程 -- 同步執(zhí)行 -- 不開啟子線程
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作
}];
[operation start];
情景二 、封裝一個(gè)NSOperation操作,往里添加多個(gè)block任務(wù),
分析1: 第一個(gè)操作 : 主線程 -- 異步執(zhí)行 -- 不開啟子線程
分析2: 后添加的操作 : 子線程 -- 異步執(zhí)行 -- 開啟子線程
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作A
}];
[operation addExecutionBlock:^{
// 要執(zhí)行的任務(wù)或操作B
}];
[operation addExecutionBlock:^{
// 要執(zhí)行的任務(wù)或操作C
}];
[operation start];
操作A在主線程, 操作B、C在子線程
情景三 、創(chuàng)建一個(gè)NSOperationQueue的隊(duì)列 封裝一個(gè)(或者多個(gè))NSOperation操作
分析: 子線程 -- 異步執(zhí)行 -- 開啟子線程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作
}];
[queue addOperation:operation];
操作是在子線程異步執(zhí)行
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 封裝
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作A
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
// 要執(zhí)行的任務(wù)或操作B
}];
[queue addOperation:operationA];
[queue addOperation:operationB];
[queue addOperationWithBlock:^{
// 要執(zhí)行的操作或任務(wù)C
}];
操作A、B、C是在子線程異步執(zhí)行的
常見的用法
-
設(shè)置最大并發(fā)數(shù)
- -(void)setMaxConcurrentOperationCount:(NSInteger)count;
- (NSInteger)maxConcurrentOperationCount;
-
隊(duì)列其它操作
- 取消所有操作 -(void)cancelAllOperations;
- 暫停所有操作 [queue setSuspended:YES];
- 恢復(fù)所有操作 [queue setSuspended:NO];
操作之間的依賴
- NSOperation之間可以設(shè)置依賴來保證執(zhí)行順序
- [operationB addDependency:operationA]; ---
等操作A執(zhí)行完畢后才能執(zhí)行操作B
(不能相互依賴)
線程之間的通訊
[queue addOperationWithBlock:^{
// 要執(zhí)行耗時(shí)操作
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 回到主線程執(zhí)行的操作
}];
}];