NSOperation其實(shí)就是蘋果對(duì)GCD的封裝牙咏,把GCD封裝成面向?qū)ο蟮木幊蹋岄_發(fā)者使用起來更加方便,簡(jiǎn)潔国拇。
NSOperation的核心
- NSOperation操作
- 不能直接使用疹尾。
- 定義子類共有的屬性和方法上忍。
- 子類:
- NSInvocationOperation(Swift里面沒有)
- NSBlockOperation
- NSOperationQueue隊(duì)列
- 將"操作" 添加到 "隊(duì)列"類似于GCD將"任務(wù)"添加到 "隊(duì)列"骤肛。
- 隊(duì)列:本質(zhì)上 就是GCD的并發(fā)隊(duì)列。
- 操作:異步執(zhí)行任務(wù)窍蓝。
//創(chuàng)建一個(gè)NSInvocationOperation NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test:) object:@"invocation"]; //創(chuàng)建隊(duì)列 NSOperationQueue * q = [[NSOperationQueue alloc]init]; //將操作添加到隊(duì)列 - 會(huì)自動(dòng)異步執(zhí)行調(diào)度方法 [q addOperation:op];
//創(chuàng)建NSBlockOperation對(duì)象 NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@ --- %d",[NSThread currentThread],i); }]; //創(chuàng)建隊(duì)列 NSOperationQueue * q = [[NSOperationQueue alloc]init]; //添加到隊(duì)列 [q addOperation:op];
線程間的通訊(開發(fā)中常用寫法)
[self.opQueue addOperationWithBlock:^{
NSLog(@"耗時(shí)操作 %@",[NSThread currentThread]);
//主線程更新 UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@ %@",[NSThread currentThread]);
}];
}];
最大并發(fā)數(shù)
//這個(gè)屬性便能控制線程的最大并發(fā)數(shù)
self.opQueue.maxConcurrentOperationCount = 2;
隊(duì)列的暫停和繼續(xù)
- suspended: 決定隊(duì)列的暫停和繼續(xù)
//YES暫停NO繼續(xù) self.opQueue.suspended = NO;
- operationCount : 隊(duì)列中的操作數(shù)
self.opQueue.operationCount
取消所有操作
- 隊(duì)列掛起的時(shí)候,不會(huì)清空內(nèi)部的操作.只有在隊(duì)列繼續(xù)的時(shí)候才會(huì)清空腋颠。
- 正在執(zhí)行的操作也不會(huì)被取消。
[self.opQueue cancelAllOperations];
依賴關(guān)系
例子:
//1.下載
NSBlockOperation * op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下載---%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:.5];
}];
//2.解壓
NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解壓---%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
//3.通知用戶
NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"通知用戶---%@",[NSThread currentThread]);
}];
//NSOperation 提供了依賴關(guān)系
//注意,不要指定循環(huán)依賴,隊(duì)列就不工作了!!
[op2 addDependency:op1];
[op3 addDependency:op2];
//添加到隊(duì)列中 waitUntilFinished:是否等待! //會(huì)卡住當(dāng)前線程!
[self.opQueue addOperations:@[op1,op2,op3] waitUntilFinished:NO];
添加好依賴條件操作就會(huì)等待依賴的操作執(zhí)行完再執(zhí)行吓笙。