NSOperation 是一个抽象基类,使用的话最多的是系统封装好的两个类
- NSInvocationOperation
- NSBlockOperation
NSOperation必须配合NSOperationQueue使用,否则没毛用。在自定义队列中两者都是异步执行,且都在子线程执行。block内部同步执行。
基本用法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//任务执行
}];
[queue addOperation:operation];
//可以设置maxConcurrentOperationCount 最大线程数,为1则成为一个串行队列
实例
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"----");
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//2.封装操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
sleep(3);
NSLog(@"这是第一次%@",[ NSThread currentThread]);
}];
//3.封装操作
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
sleep(4);
NSLog(@"这是第二次%@",[ NSThread currentThread]);
}];
//4.合成数据
NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{
sleep(5);
//7.回到主线程刷新UI
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
NSLog(@"刷新UI---%@",[NSThread currentThread]);
}];
}];
//5.设置操作依赖
[combine addDependency:op1];
[combine addDependency:op2];
//6.添加操作到队列中执行
//可跨队列创建依赖
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:combine];
//或
[queue addOperations:[op1,op2,combine] waitUntilFinished:NO];
//Bool参数表示当前线程是否等待所有任务完成再返回。
}