多线程知识之NSOperation的使用

/***************创建队列的方式**************/

1.主队列,凡是添加到主队列中的任务(NSOperation),都会放到主线程中执行

NSOperationQueue *queue = [NSOperationQueue mainQueue];

2.其它队列(串行队列、并发队列),添加到这种队列中的任务(NSOperation),就会自动放到子线程中执行

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

/***************最大并发数(控制线程数量)**************/

queue.maxConcurrentOperationCount = 2; 

queue.maxConcurrentOperationCount = 1; // 就变成了串行队列

最大并发数的相关方法

- (NSInteger)maxConcurrentOperationCount;

- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

/***************创建操作(任务)**************/

1.创建NSInvocationOperation

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];

2.创建NSBlockOperation

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"download2 --- %@", [NSThread currentThread]);

}];

3.添加额外的任务(默认放到子线程执行)

[op2 addExecutionBlock:^{

        NSLog(@"download3 --- %@", [NSThread currentThread]);

}];

4.自定义MyOperation(继承NSOperation,并且将需要执行的任务放在main方法中)

MyOperation *op4 = [[MyOperation alloc] init];

自定义NSOperation的步骤
重写- (void)main方法,在里面实现想执行的任务
 
重写- (void)main方法的注意点
自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应

/***************添加任务到队列(默认会自动开启任务)**************/

方式一:

[queue addOperation:op1];

[queue addOperation:op2];

[queue addOperation:op3];

[queue addOperation:op4];

方式二:

[queue addOperationWithBlock:^{

        //将操作(任务)放在此处

        NSLog(@"download1 --- %@", [NSThread currentThread]);

}];

/***************暂停队列**************/

self.queue.suspended = YES;

- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

- (BOOL)isSuspended;

/***************取消队列**************/

[self.queue cancelAllOperations];

- (void)cancelAllOperations;

提示:也可以调用NSOperation的- (void)cancel方法取消单个操作

/***************操作依赖**************/

NSOperation之间可以设置依赖来保证执行顺序
比如一定要让操作A执行完后,才能执行操作B,可以这么写
[operationB addDependency:operationA]; // 操作B依赖于操作A
可以在不同queue的NSOperation之间创建依赖关系
注意:不能相互依赖,操作依赖需要在添加队列之前设置
 
/***************操作监听**************/
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"download----%@", [NSThread  currentThread]);

}];

op.completionBlock = ^{

        NSLog(@"op执行完毕---%@", [NSThread currentThread]);

};

可以监听一个操作的执行完毕

- (void (^)(void))completionBlock;

- (void)setCompletionBlock:(void (^)(void))block;

 
/***************线程之间的通信**************/

[[[NSOperationQueue alloc] init] addOperationWithBlock:^{

        // 此处放耗时操作

        // 回到主线程

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            self.imageView.image = image;

        }];

}];

原文地址:https://www.cnblogs.com/wangliang2015/p/5408119.html