ios多线程操作(十一)—— NSOperation的高级操作

NSOperation可以调用start方法来执行任务,但默认是同步执行的,如果将NSOperation添加到      NSOperationQueue(操作队列)中,系统会自动异步执行队列中的操作。

NSOperationQueue中可以对操作进行取消,暂停和恢复

取消函数为:

[objc] view
plain
 copy

  1. - (void)cancelAllOperations;

也可以调用NSOperation的cancel方法来取消单个操作

[objc] view
plain
 copy

  1. - (void)cancel;

队列中有个属性 suspended
,通过设置该BOOL值的YES或NO来暂停和恢复操作。

操作也有优先级,通过设置NSOperation在队列中的优先级,可以改变操作的执行优先级,NSOperation中有个属性queuePriority,

可以通过该属性来设置,优先级的取值都有

NSOperationQueuePriorityVeryLow = -8L,

NSOperationQueuePriorityLow = -4L,

NSOperationQueuePriorityNormal = 0,

NSOperationQueuePriorityHigh = 4,

NSOperationQueuePriorityVeryHigh = 8

NSOperation中具备一个非常常用的属性,该属性在头文件中得定义如下

[objc] view
plain
 copy

  1. @property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);

通过该属性我们可以进行操作的监听,当该操作执行完毕后,就会执行completionBlock中的块代码,例如:

[objc] view
plain
 copy

  1. // 新建一个块操作
  2. NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  3. [NSThread sleepForTimeInterval:3.0];
  4. NSLog(@"%@ , come here",[NSThread currentThread]);
  5. }];
  6. // 新建一个操作队列
  7. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  8. // 将操作添加到队列
  9. [queue addOperation:op];
  10. // 监听该操作,当完成该操作后执行的代码
  11. [op setCompletionBlock:^{
  12. [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  13. NSLog(@"%@,here",[NSThread currentThread]);
  14. }];
  15. }];

效果如下:

无论执行什么操作,块代码总会在最后执行!

NSoperation之间可以设置依赖来保证执行顺序,例如:

[objc] view
plain
 copy

  1. NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
  2. NSLog(@"用户登录 %@", [NSThread currentThread]);
  3. }];
  4. NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
  5. NSLog(@"付费 %@", [NSThread currentThread]);
  6. }];
  7. NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
  8. [NSThread sleepForTimeInterval:1.0f];
  9. NSLog(@"下载 %@", [NSThread currentThread]);
  10. }];
  11. NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
  12. NSLog(@"更新UI %@", [NSThread currentThread]);
  13. }];
  14. /* "指定任务之间的依赖关系" - GCD使用的同步任务(不会开线程)
  15. NSOperation 会开线程,但是依然能够保证操作的执行顺序,并发效率会更好!
  16. 依赖关系,是可以跨队列的 */
  17. // 付费之前需要登录
  18. [op2 addDependency:op1];
  19. // 下载之前需要付费
  20. [op3 addDependency:op2];
  21. // 更新UI之前需要完成下载
  22. [op4 addDependency:op3];
  23. // 注意:在指定依赖关系时,注意不要出现循环依赖
  24. // waitUntilFinished == NO,异步的 YES 是同步的
  25. [self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];
  26. // 更新UI的操作,应该由主队列来调度
  27. [[NSOperationQueue mainQueue] addOperation:op4];
  28. NSLog(@"come here");

执行效果如下:

时间: 2024-09-29 03:40:50

ios多线程操作(十一)—— NSOperation的高级操作的相关文章

iOS多线程编程之NSOperation和NSOperationQueue的使用(转自容芳志专栏)

转自由http://blog.csdn.net/totogo2010/ 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main.相当与ja

iOS多线程技术—自定义NSOperation

iOS多线程技术—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. // // YYViewController.h // 01-自定义Operation // // Created by apple on 14-6-26. // Copyright (c) 2014年 itcase. All rights reserved.

iOS 多线程学习笔记 —— NSOperation

本文复制.参考自文章:iOS多线程编程之NSOperation和NSOperationQueue的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 这里对原作者的辛勤工作表示感谢! 1. 使用抽象的 NSOperation 的方式有两种: (1)用库定义好的子类: NSInvocationOperation 和 NSBlo

iOS多线程(GCD NSOperation NSThread)

进程:进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 线程:1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行,比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行.1个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,1个线程只能执行1个任务,比如在1个线程中下载3个文件(分别是文

iOS多线程开发之NSOperation - 快上车,没时间解释了!

一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强,很屌的是加入了操作依赖. 默认情况下,NSOperation单独使用时只能同步执行操作,并没有开辟新线程的能力,只有配合NSOperationQueue才能实现异步执行.讲到这里,我们不难发现GCD和NSOperation实现的方式很像,其实这更像是废话,NSOperation本身就是基于GCD的

iOS多线程编程之NSOperation和NSOperationQueue的使用

前一篇 <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

iOS多线程管理-Thread,NSOperation,GCD的简单用法

多线程 1.程序是一个可执行文件 2.进程是程序执行的一个操作实体 3.进程是线程的集合 4.多线程就是在一个程序(一个进程)中开启多条线路,为并发执行多个任务提供方便. 什么是线程? 1.进程当中并发执行的代码片段 2.线程是提高代码效率的一个手段 3.IOS中主要用于防止界面假死 4.线程是处理异步任务的主要手段 =============================== NSThread 1.+ (void)detachNewThreadSelector:(SEL)selector t

iOS多线程——GCD与NSOperation总结

很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不阻塞主线程,简直完美. 在某些场合,我们还见过另一个“高深”的名词——“异步”.这东西好像和多线程挺类似,经过一番百度(阅读了很多质量层次不齐的文章)之后,很多人也没能真正搞懂何为“异步”. 于是,带着对“多线程”和“异步”的懵懂,很多人又开开心心踏上了多线程编程之旅,比如文章待会儿会提到的GCD.