原文地址:http://nshipster.com/nsoperation/

大家都知道的秘密是一个应用程序,瞬间响应卸载计算在后台异步完成。因此,现代的Objective-C开发者有两种选择:大中央调度NSOperation的

由于GCD已经相当主流,让专注于后者,面向对象的方法。

NSOperation的代表计算的单个单元。这是一个抽象类,让子类状态,优先级,依赖,和消除模型等方面的有用的,线程安全的方式。或者,如果子类是不是你杯茶,总是NSBlockOperation,一个具体的子类,包装业务块。

任务本身的NSOperation的例子包括网络请求,调整图像大小,语言处理,或任何其他可重复的,结构性的,长期运行的任务,处理后的数据返回。

但是,简单包装成一个对象的计算并没有做太多,没有一点点的疏忽。这就是NSOperationQueue用武之地。

NSOperationQueue调节操作并发执行。它作为一个优先级队列,执行这样的操作大致先入先出的方式,具有较高的优先级(NSOperation的queuePriority的)那些低优先级的跳跃前进。NSOperationQueue执行操作的同时,选项可以同时执行(maxConcurrentOperationCount)的最大数量限制。

要揭开序幕的NSOperation,你可以调用启动,或将它添加到NSOperationQueue,它会自动开始操作,当它到达队列前面。

走吧NSOperation的不同部位,描述如何使用它们,以及如何实现它们在子类中:

NSOperation的编码相当优雅的状态机来描述执行的操作:

的IsReady → → isFinished的isExecuting

代替一个明确的国有财产,国家确定隐含通过KVO那些keypaths的通知。也就是说,是准备要执行的操作时,它发送一个国际志愿者组织的IsReady码路径,其对应的属性,然后返回YES通知。

每个属性必须是相互排斥的,从一个另一个在为了编码一致的状态:

  • 的IsReady:返回“ 是“,以表示该操作已准备好执行,或者,如果为“ 否“有一些还没有完成初始化步骤,它是依赖。
  • isExecuting:返回YES如果操作是目前工作在它的任务,否则“ 或“ 否“
  • isFinished的回报如果操作的任务顺利执行完毕,或如果该操作已被取消。一个NSOperationQueueisFinished的变化,直到队列中取出的操作,因此它是至关重要的正确,以便实现这个无法避免死锁。

消除

这可能是有用的早期取消操作被执行,以防止不必要的工作。取消的原因可能包括明确的用户操作,或未能在相关的操作。

类似的执行状态,NSOperation的通信取消状态的变化,通过志愿的isCancelled码路径。当操作响应取消命令,它应该清理的任何内部细节,并尽可能快地到达一个合适的最终状态。具体而言,两个isCancelled isFinished的值需要变成“ YES“ ,并且该值的isExecuting 序号

有一件事一定要注意的是围绕“取消”一词拼写的特殊性。虽然拼写不同方言之间,当它涉及到的NSOperation

  • 取消的方法使用一个L(动词)
  • isCancelled:使用两个L's的财产(形容词)

优先

所有操作可能无法享受同样重要。将促进设置queuePriority属性或在一个NSOperationQueue根据以下排名推迟的操作:

  • NSOperationQueuePriorityVeryHigh
  • NSOperationQueuePriorityHigh
  • NSOperationQueuePriorityNormal
  • NSOperationQueuePriorityLow
  • NSOperationQueuePriorityVeryLow

此外,操作可以指定一个的值的ThreadPriority,这是一个值,该值介于0.01.0之间,其中1.0表示最高优先级。鉴于queuePriority确定的顺序操作开始,的的ThreadPriority指定分配的计算,一旦操作已经开始。但与大多数线程的细节,如果你不知道那是什么,你可能并不需要知道一下也无妨。

依赖关系

根据您的应用程序的复杂性,它可能是有意义,瓜分大任务分解成一系列的组合的子任务。你可以做使用NSOperation的依赖。

例如,要描述的过程中,从服务器下载和调整图像大小,你可能会想瓜分网络为一个操作和调整到另一个(或许重用下载其他资源的联网运行,或重用调整操作的图像已经在磁盘上)。然而,不能调整大小的图像,直到其下载。因此,我们说的网络操作是依赖调整大小的操作,前必须完成调整大小操作就可以开始。以代码:

[resizingOperation addDependency:networkingOperation];
[operationQueue addOperation:networkingOperation];
[operationQueue addOperation:resizingOperation];

操作将无法启动,直到所有依赖返回YES isFinished的。重要的是要记住的依赖关系图中所涉及的所有的操作添加到操作队列,以免沿途的某个地方一定的差距。

另外,确保不会意外产生依赖关系循环,使得A依赖于B,和B依赖于A,例如。这将创建死锁和悲伤。

completionBlock

一个非常有用的功能中添加了块复兴的iOS 4和雪豹是财产completionBlock

一个NSOperation的完成时,它将执行其正是completionBlock一次。这提供了一个非常好的方法,模型中使用自定义的操作行为时,或查看控制器。例如,你可以在网络上完成块操作块做一些与服务器的响应数据,一旦其完成加载。


NSOperation的仍然是一个必不可少的工具,在现代的Objective-C程序员一袋招数。而GCD线异步处理的理想选择,NSOperation的提供更全面的,面向对象的模型的计算,这是理想的封装周围结构,可重复的任务,在应用程序中的所有数据。将它添加到你的下一个项目,不仅是对你的用户带来喜悦,但自己!

NSOperation 详解的更多相关文章

  1. iOS多线程之NSOperation详解

    使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOpe ...

  2. iOS 多线程之NSOperation篇举例详解

    这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...

  3. AFNetworking 与 UIKit+AFNetworking 详解

    资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...

  4. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  5. 《招一个靠谱的移动开发》iOS面试题及详解(下篇)

    iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷 ...

  6. 《招一个靠谱的移动开发》iOS面试题及详解(上篇)

    以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...

  7. iOS10 语音播报填坑详解(解决串行播报中断问题)

    iOS10 语音播报填坑详解(解决串行播报中断问题) 在来聊这类需求的解决方案之前,咱们还是先来聊一聊这类需求的真实使用场景:语音播报.语音播报需求运用最为广泛的应该是收银对账了,就类似于支付宝.微信 ...

  8. ios 多线程之NSThread篇举例详解

    这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSThread的开始.取消.在当前线程执行任务. ...

  9. 【转】IOS开发网络篇之──ASIHTTPRequest详解

    ASIHTTPRequest 详解, http 请求终结者 版权归旺财勇士所有〜转载需声名〜 原贴地地址:http://wiki.magiche.net/pages/viewpage.action?p ...

随机推荐

  1. CesiumLab V1.3 新功能 MAX场景处理(免费Cesium处理工具集)

    每次到写文章的时候就很高兴,意味着又有重大功能更新了,也意味着10多天昏天黑地的闭关日子暂时结束了. 依照惯例,先放图   小范围精模型cesium加载效果   大范围白模cesium加载效果     ...

  2. 一致性Hash算法原理,java实现,及用途

    学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使 ...

  3. CentOS 7 yum 安装与配置MySQL5.7

    1.下载mysql源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2.安装mysql源 yu ...

  4. Leetcode572.Subtree of Another Tree另一个树的子树

    给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定的树 ...

  5. 关于本地文件请求json文件

    因为需要用到json数据格式,上网查了一下例子之后我就想本地测试一下看能不能成功. 结果,chrome下没有任何反应,打开控制台之后报错如下: XMLHttpRequest cannot load f ...

  6. js实现自由落体

    实现自由落体运动需要理解的几个简单属性: clientHeight:浏览器客户端整体高度 offsetHeight:对象(比如div)的高度 offsetTop:对象离客户端最顶端的距离 <!d ...

  7. Sublime Text3 安装less

    1.安装Sublime 插件 (1)安装LESS插件:因为Sublime不支持Less语法高亮,所以,先安装这个插件,方法: ctrl+shift+p>install Package>输入 ...

  8. JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...

  9. Directx11教程(34) 纹理映射(4)

    原文:Directx11教程(34) 纹理映射(4)     本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化. 原始的代码是:     ...

  10. 封装好的MySQL.class.php类

    封装好的MySQL.class.php类 作用:数据库操作类 <?php header('content-type:text/html;charset=utf-8'); class MySQLD ...