多线程知识之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];
/***************添加任务到队列(默认会自动开启任务)**************/
方式一:
[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方法取消单个操作
/***************操作依赖**************/
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;
}];
}];