多线程之NSOperation
和GCD一样,NSOperation也是苹果提供给我们的一套多线程解决方案。实际上它也是基于GCD开发的,但是比GCD拥有更强的可控性和代码可读性。
NSOperation是一个抽象基类,基本没有什么实际使用价值。我们使用最多的是系统封装好的NSInvocationOperation和NSBlockOperation。
NSInvocationOperation和NSBlockOperation封装的操作都是在当前线程中调用的,有可能把主线程给卡死,这两个NSOperation子类只有基于NSOperationQueue才能安全,NSOperationQueue是一个队列,它有两个创建方式
[NSOperationQueue mainQueue]
[[NSOperationQueue alloc] init]
第一个是主队列,在主线程中串行执行任务,第二个是非主队列,默认为并发队列
NSInvocationOperation与NSOperationQueue的配合使用
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download1) object:nil]; NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download2) object:nil]; NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download3) object:nil]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3];
NSBlockOpeartion与NSOperationQueue的配合使用
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"download1-----%@", [NSThread currentThread]); }]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"download2-----%@", [NSThread currentThread]); }]; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"download3-----%@", [NSThread currentThread]); }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3];
追加任务
[op3 addExecutionBlock:^{ NSLog(@"download4-----%@", [NSThread currentThread]); }];
添加依赖,注意:不能循环依赖
[op1 addDependency:op3];
[op3 addDependency:op2];
添加监听
op2.completionBlock = ^{ NSLog(@"---添加监听---"); };
当任务过多时,开启的子线程过多会消耗更多的内存资源,NSOperationQueue有一个属性maxConcurrentOperationCount,最大的并发数,能很好的控制同时并发的任务。
线程之间的通信
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ //回到主线程 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"-----%@", [NSThread currentThread]); }]; }];
浙公网安备 33010602011771号