NSOperation其实就是苹果对GCD的封装,把GCD封装成面向对象的编程,让开发者使用起来更加方便,简洁。
NSOperation的核心
- NSOperation操作
- 不能直接使用。
- 定义子类共有的属性和方法。
- 子类:
- NSInvocationOperation(Swift里面没有)
- NSBlockOperation
- NSOperationQueue队列
- 将"操作" 添加到 "队列"类似于GCD将"任务"添加到 "队列"。
- 队列:本质上 就是GCD的并发队列。
- 操作:异步执行任务。
//创建一个NSInvocationOperation NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test:) object:@"invocation"]; //创建队列 NSOperationQueue * q = [[NSOperationQueue alloc]init]; //将操作添加到队列 - 会自动异步执行调度方法 [q addOperation:op];
//创建NSBlockOperation对象 NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@ --- %d",[NSThread currentThread],i); }]; //创建队列 NSOperationQueue * q = [[NSOperationQueue alloc]init]; //添加到队列 [q addOperation:op];
线程间的通讯(开发中常用写法)
[self.opQueue addOperationWithBlock:^{
NSLog(@"耗时操作 %@",[NSThread currentThread]);
//主线程更新 UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@ %@",[NSThread currentThread]);
}];
}];
最大并发数
//这个属性便能控制线程的最大并发数
self.opQueue.maxConcurrentOperationCount = 2;
队列的暂停和继续
- suspended: 决定队列的暂停和继续
//YES暂停NO继续 self.opQueue.suspended = NO;
- operationCount : 队列中的操作数
self.opQueue.operationCount
取消所有操作
- 队列挂起的时候,不会清空内部的操作.只有在队列继续的时候才会清空。
- 正在执行的操作也不会被取消。
[self.opQueue cancelAllOperations];
依赖关系
例子:
//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 提供了依赖关系
//注意,不要指定循环依赖,队列就不工作了!!
[op2 addDependency:op1];
[op3 addDependency:op2];
//添加到队列中 waitUntilFinished:是否等待! //会卡住当前线程!
[self.opQueue addOperations:@[op1,op2,op3] waitUntilFinished:NO];
添加好依赖条件操作就会等待依赖的操作执行完再执行。
网友评论