iOS多线程小结( NSOperation)
2016-06-07 16:35
330 查看
一) NSOperation使用方法:
NSOperation 实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。NSOperation在ios4后也基于GCD实现,但是相对于GCD来说可控性更强,并且可以加入操作依赖。NSOperation提供了ready, cancelled, executing, finished这几个状态变化,我们的开发也是必须处理自己关心的其中的状态。这些状态都是基于keypath的KVO通知决定,所以在你手动改变自己关心的状态时,请别忘了手动发送通知。这里面每个属性都是相互独立的,同时只可能有一个状态是YES。finished这个状态在操作完成后请及时设置为YES,因为NSOperationQueue所管理的队列中,只有isFinished为YES时才将其移除队列,这点在内存管理和避免死锁很关键。
1.NSInvocationOperation:
2 NSBlockOperation
3 NSOperationQueue
3.1 添加一个队列
3.2 主队列(任何刷新UI的方法都必须在主队列中执行)
3.3 队列直接可以设置依赖,比如队列1需要队列2执行完毕后才能执行(addDependency)
3.4可以设置最大并发的操作数量
3.5 一旦添加到队列,队列就拥有了这个Operation对象并且不能被 删除,唯一能做的事情是取消。
3.6获取NSOperation
myQueue.operations 这是一个数组,里面存放这添加进入这个队列的所有任务
3.7 如果你想临时暂停Operations的执行,可以使用queue的setSuspended:方法暂停queue。
NSOperation 实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。NSOperation在ios4后也基于GCD实现,但是相对于GCD来说可控性更强,并且可以加入操作依赖。NSOperation提供了ready, cancelled, executing, finished这几个状态变化,我们的开发也是必须处理自己关心的其中的状态。这些状态都是基于keypath的KVO通知决定,所以在你手动改变自己关心的状态时,请别忘了手动发送通知。这里面每个属性都是相互独立的,同时只可能有一个状态是YES。finished这个状态在操作完成后请及时设置为YES,因为NSOperationQueue所管理的队列中,只有isFinished为YES时才将其移除队列,这点在内存管理和避免死锁很关键。
1.NSInvocationOperation:
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[op start];//开始
[op cancel];//取消
2 NSBlockOperation
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); //处理线程的block方法 }];
3 NSOperationQueue
一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。一旦NSoperation添加到NSoperationQueue中,用户就无权对NSoperation管理,都有NSoperationQueue来执行。
3.1 添加一个队列
NSoperationQueue *myQueue = [[NSOperationQueue alloc]init]; NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil]; [myQueue addOperation:op];
3.2 主队列(任何刷新UI的方法都必须在主队列中执行)
[[NSOperationQueue mainQueue]addOperationWithBlock:^{ //可以执行刷新UI控件的方法 }];
3.3 队列直接可以设置依赖,比如队列1需要队列2执行完毕后才能执行(addDependency)
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); }]; NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); }]; [block1 addDependency:block2]; [myQueue addOperation:block1]; [myQueue addOperation:block2];
3.4可以设置最大并发的操作数量
[myQueue setMaxConcurrentOperationCount:2];
3.5 一旦添加到队列,队列就拥有了这个Operation对象并且不能被 删除,唯一能做的事情是取消。
[myQueue cancelAllOperations];
3.6获取NSOperation
myQueue.operations 这是一个数组,里面存放这添加进入这个队列的所有任务
3.7 如果你想临时暂停Operations的执行,可以使用queue的setSuspended:方法暂停queue。
[myQueue setSuspended:YES];
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 我是运营,我没有假期
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 交换机升级排障实例
- C#实现多线程的同步方法实例分析
- 修复mysql数据库
- 浅谈chuck-lua中的多线程
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解