NSOperation 是iOS多线程其中一种常用形式, 它的执行步骤:
程序员:1、先将需要执行的一个操作封装到一个NSOperation对象中。
2 、然后将NSOperation 对象添加到NSOperationQueue中。
系统 : 3、系统会自动将NSOperationQueue 中的NSOperation取出来。
4、 将取出来的NSOperation封装的操作放到一条新的线程中执行。
NSInvocationOperation:
// NSOperation为抽象类,不能直接使用。 --- 事务 () + queue = 把事务添加到队列 ---> 然后去执行
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opTest) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 由系统调控
[queue addOperation:op];
// 手动吊起
//[op start];
注意: 要么将任务添加队列, 让系统操控, 要么手动调起,不能同时调用。
block 写法:NSBlockOperation
+(id)blockOperationWithBlock:(void(^)(void))block;
- 创建NSBlockOperation对象
-(void)addExecutionBlock:(void(^)(void))block;
- 通过addExecutionBlock:方法添加更多的操作
代码如下
// 操作优先级
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSThread ==111111 %@",[NSThread currentThread]);
// 并发
[NSThread sleepForTimeInterval:1];
NSLog(@"123");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"更新UI");
}];
}];
// CPU 调度的评率高
// op.qualityOfService =
[op addExecutionBlock:^{
NSLog(@"456");
}];
op.completionBlock = ^{
NSLog(@"完成");
};
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 由系统调控
[queue addOperation:op];
OperationQueue 的操作
maxConcurrentOperationCount : 最大并发操作数
addOperationWithBlock:balck 添加执行任务, 可以添加多个
self.queue = [[NSOperationQueue alloc] init];
self.queue.name = @"com.cooci.cn";
self.queue.maxConcurrentOperationCount = 2;
[self.queue addOperationWithBlock:^{
for (int i = 0; i<1000; i++) {
[NSThread sleepForTimeInterval:1];
NSLog(@"%@1111111111--%d",[NSThread currentThread],i);
}
}];
[self.queue addOperationWithBlock:^{
for (int i = 0; i<1000; i++) {
[NSThread sleepForTimeInterval:1];
NSLog(@"%@222222222--%d",[NSThread currentThread],i);
}
}];
挂起/继续 操作
if (self.queue.operationCount == 0) {
NSLog(@"没有操作执行");
return;
}
if (self.queue.suspended) {
NSLog(@"当前挂起来了");
}else{
NSLog(@"执行....");
}
self.queue.suspended = !self.queue.isSuspended;
取消全部任务
[self.queue cancelAllOperations];
依赖 addDependency
1. 假设三个任务 NSBlockOperation1 、 NSBlockOperation2、NSBlockOperation3
2. 设置三个依赖,2的输入是1的结果,3的输入是2的结果。
[2 addDependency:1];
[3 addDependency:2];
[self.queue addOperations:@[1,2,3] waitUntilFinished:NO];
关于 waitUntilFinished,一般设置为NO, 这样不堵塞后边的执行。