NSOperation 详解
原文地址: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的回报是如果操作的任务顺利执行完毕,或如果该操作已被取消。一个NSOperationQueue不isFinished的变化是,直到队列中取出的操作,因此它是至关重要的正确,以便实现这个无法避免死锁。
消除
这可能是有用的早期取消操作被执行,以防止不必要的工作。取消的原因可能包括明确的用户操作,或未能在相关的操作。
类似的执行状态,NSOperation的通信取消状态的变化,通过志愿的isCancelled码路径。当操作响应取消命令,它应该清理的任何内部细节,并尽可能快地到达一个合适的最终状态。具体而言,两个isCancelled isFinished的值需要变成“ YES“ ,并且该值的isExecuting 序号。
有一件事一定要注意的是围绕“取消”一词拼写的特殊性。虽然拼写不同方言之间,当它涉及到的NSOperation:
取消的方法使用一个L(动词)isCancelled:使用两个L's的财产(形容词)
优先
所有操作可能无法享受同样重要。将促进设置queuePriority属性或在一个NSOperationQueue根据以下排名推迟的操作:
NSOperationQueuePriorityVeryHighNSOperationQueuePriorityHighNSOperationQueuePriorityNormalNSOperationQueuePriorityLowNSOperationQueuePriorityVeryLow
此外,操作可以指定一个的值的ThreadPriority,这是一个值,该值介于0.0和1.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 详解的更多相关文章
- iOS多线程之NSOperation详解
使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOpe ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...
- AFNetworking 与 UIKit+AFNetworking 详解
资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷 ...
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...
- iOS10 语音播报填坑详解(解决串行播报中断问题)
iOS10 语音播报填坑详解(解决串行播报中断问题) 在来聊这类需求的解决方案之前,咱们还是先来聊一聊这类需求的真实使用场景:语音播报.语音播报需求运用最为广泛的应该是收银对账了,就类似于支付宝.微信 ...
- ios 多线程之NSThread篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSThread的开始.取消.在当前线程执行任务. ...
- 【转】IOS开发网络篇之──ASIHTTPRequest详解
ASIHTTPRequest 详解, http 请求终结者 版权归旺财勇士所有〜转载需声名〜 原贴地地址:http://wiki.magiche.net/pages/viewpage.action?p ...
随机推荐
- 计蒜客 Zoning Houses(线段树区间最大次大)
Given a registry of all houses in your state or province, you would like to know the minimum size of ...
- Uva116 Unidirectional TSP
https://odzkskevi.qnssl.com/292ca2c84ab5bd27a2a91d66827dd320?v=1508162936 https://vjudge.net/problem ...
- vue自定义指令之拖动页面的元素
此案例中,用到了鼠标事件onmousedown.onmousemove.onmouseup 源代码如下: <!doctype html><html lang="en&quo ...
- 微信网页授权demo1
要授权首先要网页域名授权 然后就index.php代码如下 <?php require_once("./function.php"); $url = 'http://'.$_ ...
- CF1067E Random Forest Rank
CF1067E Random Forest Rank 可以证明: 一个树的邻接矩阵的秩,等于最大匹配数*2(虽然我只能证明下界是最大匹配) 而树的最大匹配可以贪心, 不妨用DP模拟这个过程 f[x][ ...
- Django创建对象的create和save方法
Django的模型(Model)的本质是类,并不是一个具体的对象(Object).当你设计好模型后,你就可以对Model进行实例化从而创建一个一个具体的对象.Django对于创建对象提供了2种不同的s ...
- Centos7.2源码编译安装LA(N)MP
LAMP环境中php是作为apache的模块安装的,所以安装顺序是php放在apache的后面安装,这样便于安装php时可以在apache的模块目录生成对应的php模块. apache版本:2.4.3 ...
- vue 根据数组中某一项的值进行排序
一.前言 我在vue项目中遇到了一个表格排序的需求,根据某一项的值的大小从大到小调整数组顺序. 二.代码 表格大概是这个样子,样式和图片在代码中简化了. <table class="r ...
- objectarx MFC 非模态对话框为当前焦点
dialog.h afx_msg LRESULT OnAcadKeepFocus(WPARAM, LPARAM); dialog.cpp BEGIN_MESSAGE_MAP(CTextDialog, ...
- JavaScript--函数表达式与函数声明的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...