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 ...
随机推荐
- HTML 页面间传值(包含中文)
A页面——>B页面 A页面 $('.edit-bottom').click(function () { var word1=$('#word').val();//需要传到B页面的值 var ur ...
- MYSQL基础常识
所有的数据库名.表名.表字段都是区分大小写的.所以在使用mysql命令时需要输入正确的名称 MYSQL命令终止符是分号; 1.MYSQL的连接:mysql -u root -p(\q或exit退出); ...
- Python网络爬虫与信息提取[request库的应用](单元一)
---恢复内容开始--- 注:学习中国大学mooc 嵩天课程 的学习笔记 request的七个主要方法 request.request() 构造一个请求用以支撑其他基本方法 request.get(u ...
- ADSL pppoe 拔号工具rp-pppoe
rp-pppoe 目前在各大发行版本都是存在的,比如Redhat/Fedora.红旗.Slackware.Debian.SuSE等系统,都是采用这个拔号软件,所以您大可不必为下载源码编译安装.只需要在 ...
- 举例分析private的作用【c/c++学习】
抛砖引玉: c++中private的用处 我知道我们可以用 public 中的值,把private中的数据给提出来,但是还是搞不懂private该怎么用,或者说在一个具体程序中,private有什么用 ...
- Linux的概述与分类
1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的, ...
- 【水滴石穿】React-Redux-Demo
这个项目没有使用什么组件,可以理解就是个redux项目 项目地址为:https://github.com/HuPingKang/React-Redux-Demo 先看效果图 点击颜色字体颜色改变,以及 ...
- Spring_使用(JDBC)
Spring_对JDBC的支持 使用JdbcTemplate更新数据库 导入jar包 创建applicationcontext.xml <?xml version="1.0" ...
- text()和html()区别
这两天看了一下html和jquery的选择器,并对w3chool上面的在线编辑产生了兴趣,但是在用textarea展示后台纯html的时候发生错误,查阅各种资料发现不行--心态炸了.废话不多说了,上干 ...
- JavaScript--模拟百度搜索下拉li
上效果: 主要思路: 函数indexOf() .join().innerHTML的使用,还有 用完的数组要清空 <!DOCTYPE html> <html> <head ...