原文地址: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. 你应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单. 说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与 ...

  2. ie6 png 透明的解决方法,大网站都在用

    今天解决png图片在IE6下的背景透明问题,找到了一个好方法.之前的解决方案会造成错位,使页面变形.现把这个方法公布如下,本人亲测可以正常使用,如果你在使用中出现问题,请看实例中的说明(英文不精的童鞋 ...

  3. C++中的 istringstream 的用法

    C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含<sstream>这个头文件. istringstream ...

  4. HDU 1724 自适应辛普森法

    //很裸的积分题,直接上模板 #include<stdio.h> #include<math.h> int aa, bb; //函数 double F(double x){ - ...

  5. VUE ECharts人际关系图

    1. 概述 1.1 说明 项目中需要对某个人的人际关系进行展示,故使用echarts中的关系图进行处理此需求. 2. 代码 2.1 代码示例 <template> <div clas ...

  6. Spring boot--控制器增强

    在Spring3.2中,新增了@ControllerAdvice注解.关于这个注解的官方说明https://docs.spring.io/spring-framework/docs/5.0.0.M1/ ...

  7. to_char 中fm

     1,有9的地方如果有数字就显示如果没有数字就不显示,有0的地方在没有数字的时候也会有0来占位 select to_char(9999.09556,'fm99999.0900'),to_char(99 ...

  8. oralce管理命令

    Emctl start agent TZ set to PRC Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0 Co ...

  9. ubuntu上安装notepadpp

    Notepad++是一套非常有特色的自由软件的纯文字编辑器(许可证:GPL).有完整的中文化接口及支持多国语言编写的功能(UTF8 技术).它的功能比 Windows 中的 Notepad(记事本)强 ...

  10. 如何解决IntelliJ在打包Maven项目时不打包配置文件

    在pom文件中加上你的配置文件夹目录: <build> <resources> <resource> <directory>src/res</di ...