ios多线程操作(十一)—— NSOperation的高级操作
来源:互联网 发布:如何下载excel2007软件 编辑:程序博客网 时间:2024/06/05 17:37
NSOperation可以调用start方法来执行任务,但默认是同步执行的,如果将NSOperation添加到 NSOperationQueue(操作队列)中,系统会自动异步执行队列中的操作。
NSOperationQueue中可以对操作进行取消,暂停和恢复
取消函数为:
- - (void)cancelAllOperations;
也可以调用NSOperation的cancel方法来取消单个操作
- - (void)cancel;
队列中有个属性 suspended ,通过设置该BOOL值的YES或NO来暂停和恢复操作。
操作也有优先级,通过设置NSOperation在队列中的优先级,可以改变操作的执行优先级,NSOperation中有个属性queuePriority,
可以通过该属性来设置,优先级的取值都有
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
NSOperation中具备一个非常常用的属性,该属性在头文件中得定义如下
- @property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);
通过该属性我们可以进行操作的监听,当该操作执行完毕后,就会执行completionBlock中的块代码,例如:
- // 新建一个块操作
- NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
- [NSThread sleepForTimeInterval:3.0];
- NSLog(@"%@ , come here",[NSThread currentThread]);
- }];
- // 新建一个操作队列
- NSOperationQueue *queue = [[NSOperationQueue alloc] init];
- // 将操作添加到队列
- [queue addOperation:op];
- // 监听该操作,当完成该操作后执行的代码
- [op setCompletionBlock:^{
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- NSLog(@"%@,here",[NSThread currentThread]);
- }];
- }];
效果如下:
无论执行什么操作,块代码总会在最后执行!
NSoperation之间可以设置依赖来保证执行顺序,例如:
- NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"用户登录 %@", [NSThread currentThread]);
- }];
- NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"付费 %@", [NSThread currentThread]);
- }];
- NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
- [NSThread sleepForTimeInterval:1.0f];
- NSLog(@"下载 %@", [NSThread currentThread]);
- }];
- NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"更新UI %@", [NSThread currentThread]);
- }];
- /* "指定任务之间的依赖关系" - GCD使用的同步任务(不会开线程)
- NSOperation 会开线程,但是依然能够保证操作的执行顺序,并发效率会更好!
- 依赖关系,是可以跨队列的 */
- // 付费之前需要登录
- [op2 addDependency:op1];
- // 下载之前需要付费
- [op3 addDependency:op2];
- // 更新UI之前需要完成下载
- [op4 addDependency:op3];
- // 注意:在指定依赖关系时,注意不要出现循环依赖
- // waitUntilFinished == NO,异步的 YES 是同步的
- [self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];
- // 更新UI的操作,应该由主队列来调度
- [[NSOperationQueue mainQueue] addOperation:op4];
- NSLog(@"come here");
执行效果如下:
0 0
- ios多线程操作(十一)—— NSOperation的高级操作
- ios多线程操作(十一)—— NSOperation的高级操作
- iOS 多线程编程<十一、NSOperation操作依赖、监控>
- ios多线程操作(十)—— 用NSOperation开启多线程操作
- ios多线程操作(十)—— 用NSOperation开启多线程操作
- iOS开发多线程篇—NSOperation基本操作
- iOS开发多线程篇—NSOperation基本操作
- iOS开发多线程—10NSOperation基本操作
- iOS开发多线程篇—NSOperation基本操作
- iOS开发多线程篇—NSOperation基本操作
- iOS开发多线程篇—NSOperation基本操作
- iOS 多线程篇10—NSOperation基本操作
- iOS学习笔记-119.多线程18——NSOperationQueue自定义NSOperation执行一个操作的取消
- ios多线程操作(九)—— 用NSOperation代替GCD
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- ios多线程操作(九)—— 用NSOperation代替GCD
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- iOS学习笔记-120.多线程19——NSOperation操作依赖和操作监听
- 使用ViewPager动画来做出不一样的引导页
- Spring基础知识汇总
- MPAndroidChart图表类框架的使用
- rsync数据备份(二)--RHEL6.5
- 智能计算/计算智能、仿生算法、启发式算法的区别与关系?
- ios多线程操作(十一)—— NSOperation的高级操作
- 一个Java音乐播放器
- 【学习anroid编译】关于运行android模拟器
- eclipse aidl.exe error while creating directories
- 解决Win10下Android Studio terminal无法输入的问题
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- lcs nlogn 算法
- OpenStack 安装教程(使用Fuel )
- 织梦后台jpeg格式图片没法上传,图片浏览器中没法查看预览