iOS 中的 NSoperation 多线程
2016-03-02 20:54
381 查看
// 第一种: NSOperation(抽象类) // NSOperation 本身没有开辟子线程能力,可以在子线程,也可以在主线程,他只是一个操作, 我们用到的都是他的子类( NSInvocationOperation NSBlockOperation) // *NSOperation 是一个抽象类,我们都是使用它的子类(面试) // *NSOperation的子类其实就是一个任务,自己没有开辟线程的能力,所以说该任务,在子线程中执行(start),就是在主线程, 在子线程中就是在子线程 - (void)createNSInvocationOperation { // 创建NSInvocationOperation对象 NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocation) object:nil]; // 可能用到的属性 // invocation.isCancelled, 判断这个任务有没有取消,当任务调用 isCancel,这个属性就变成了 YES,这个 cancel 也取消不了正在执行的任务,任务还没开始就执行取消, 同 Thread一样 // 执行该任务 [invocation start]; } - (void)invocation { NSLog(@"--主线程,%d",[NSThread isMainThread]); } // 创建 NSBlock, [NSBlockOperation blockOperationWithBlock - (void)createBlockOperation { NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ //里面写具体操作 NSLog(@"这是一个 BlockOperation在主线程%d",[NSThread isMainThread]); }]; [blockOperation start]; } // 第二种 NSOperationQueue // NSOperationQueue, 是操作队列, 用来管理一组 Operation 对象的执行 一个任务就是一个线程 // 这是一个任务队列,就是一个容器,里面都是一个个任务,可以是 block 任务,可以是 block 任务,也可以是 invocation 任务(并行) // **NSOperationQueue,才具有开辟子线程的能力 , NSInvocationOperation NSBlockOperation只是用来执行任务的 // 用来管理里面所有的内容 // 相当于开辟了一个线程队列 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; // [NSOperationQueue mainQueue] 获取主线程 // 任务1 NSInvocationOperation 任务 NSInvocationOperation *inv = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invAction) object:nil]; //任务2 NSBlockOperation 任务 NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 100; i++) { NSLog(@"BB"); } }]; //任务3 NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 100; i++) { NSLog(@"CC"); } }]; // 把3个任务添加到线程队列, 也就是有3个线程 [queue addOperation:inv]; [queue addOperation:block1]; [queue addOperation:block2]; // 添加到线程队列, 系统就会自己开启执行任务 // 设置最大并发数,默认为-1,maxConcurrentOperationCount设置线程次序 // 队列 FIFO,先进先出,所以当我们设置最大并发数为1的时候,会按照添加的顺序,先把最早加入队列任务完成之后,再去执行后面添加的任务.(并行 - > 串行) // queue.maxConcurrentOperationCount = 1; // 设置依赖关系 addDependency // *一定要在任务添加到队列之前去设置(要求:3要在2前面, 2依赖3) [block1 addDependency:block2]; // A addDependency:B意思就是: A 依赖于 B, A 的执行,依赖 B 的完成 // 添加依赖的时候,要避免循环依赖,循环依赖会导致两个任务都不会执行 [block2 addDependency:block1]; // 一些常用属性 // 查看添加到队列中的所有任务 // queue.operations,里面放的是添加到队列中的所有任务 // 常用方法 // [queue cancelAllOperations], 执行取消尚未开始执行的任务 } - (void)invAction { for (int i = 0; i<100; i++) { NSLog(@"AA"); } }
相关文章推荐
- iOS socket编程
- ios开发之多线程理论
- HDU 1017 A Mathematical Curiosity(数学题目)
- iOS 后台运行实现
- [iOS学习]关于多线程和NSThread
- ios autolayout中NSLayoutAttributeLeft(Right)与NSLayoutAttributeLeading(Trailing)区别
- 进程、多线程
- iOS-Gif图片展示N种方式(原生+第三方)
- iOS开发中的多线程的GCD用法
- iOS随机数-备
- iOS,单例
- 【解决方法】iOS 开发小技巧
- iOS 简单常用动画animation
- ios计算文字的大小
- iOS(学习) 一个简单的动画效果
- vios 多 vlan设置
- ios获取视频宽高比分辨率以及旋转角度
- IOS开发之多线程通识
- IOS——线程的应用
- 高德 ios 自定义气泡添加点击事件无效问题