NSOperation 是苹果大力推荐的"并发"技术
NSOperation 的核心概念:将"操作"添加到"队列"
GCD 将"任务"添加到"队列"
NSOperation类是一个抽象类
特点:
- 不能直接使用!
目的:
- 定义子类共有的属性和方法!
子类:
NSInvocationOperation
NSBlockOperation
NSOperation 本质上就是对GCD的面向对象的封装
本质上 就是GCD的 异步执行任务的并发队列
NSInvocationOperation
代码逻辑多的话,建议使用,层次清晰
- (void)demo
{
NSInvocationOperation* op = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(downLoad:) object:@"xiazai"];
//start 方法 会在当前线程执行调度方法
[op start];
//队列
NSOperationQueue* queue = [[NSOperationQueuealloc] init];
//将操作添加到队列 -- 会自动异步执行调度方法
[queue addOperation:op];
}
NSBlockOperation
所有代码都写在一起,便于维护
- (void)demo
{
//1.队列
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
//2.操作
for(inti =0; i <10; i ++) {
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ %@",@(i),[NSThreadcurrentThread]);
}];
//3.添加到队列
[queueaddOperation:op];
}
}
线程间的通讯
- (void)demo
{
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
NSLog(@"子线程耗时操作:%@",[NSThreadcurrentThread]);
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"更新UI:%@",[NSThreadcurrentThread]);
}];
}];
}
设置最大并发数
- (void)demo
{
//设置同时最大的并发操作数量
self.opQueue.maxConcurrentOperationCount = 2;
//添加操作进队列
/**
从iOS 8.0 开始 ,无论是使用GCD还是NSOperation 都会开启多条线程
在iOS 7.0 以前,GCD通常只会开启五六条线程
目前线程多了 说明:
1.底层的线程池更大了,能够拿到了线程资源更多了
2.对控制同时并发的线程数要求更高了
*/
for(inti =0; i <10; i ++) {
[self.opQueue addOperationWithBlock:^{
[NSThread sleepForTimeInterval:1.f];
NSLog(@"%@ %d",[NSThreadcurrentThread],i);
}];
}
}
NSOPeration可以挂起队列 即暂停&继续
当挂起队列时,正在线程中执行的任务,不受影响
@property(getter=isSuspended)BOOL suspended; 设置BOOL值,YES为挂起队列,NO为继续
- (void)cancelAllOperations; 取消所有操作
@property(readonly)NSUInteger operationCount; 队列中的操作数,可以再队列挂起时判断操作数量
- (void)addDependency:(NSOperation*)op; 依赖于某个操作
- (void)removeDependency:(NSOperation*)op; 移除对某个操作的依赖
- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; 把操作以数组的形式添加到队列中,并且是否等到操作完成.传YES的话 会卡住当前线程
GCD & NSOperation对比
GCD 在iOS 4.0 推出,主要针对多核处理器做了优化的并发技术,是C语言的
- 将"任务"[Block]添加到 队列[串行/并发/主队列/全局队列],并指定执行任务的函数[同步/异步]
- 线程间的通讯 通过dispatch_get_main_queue()拿到主线程
- 提供了NSOperation不具备的一些功能
-- 一次执行
-- 延迟执行
-- 调度组(在NSOperation中也可以做到,有点麻烦)
NSOperation 在iOS 2.0 推出 面向对象,OC语言 苹果推出GCD之后,对NSOperation底层做了重写 底层也是GCD
- 将"操作"[异步执行的任务] 添加到队列[并发队列], 就会立刻异步的执行
- 线程间的通讯 通过 mainQueue类方法
- 提供了一些GCD实现起来,比较困难的功能
-- 最大并发线程
-- 队列的暂停/继续
-- 取消所有的操作
-- 指定操作之间的依赖关系(GCD 用同步来实现)