关于Operation 的那些事

在iOS平台的并发编程中,NSOperation和NSOperationQueue扮演着非常重要的角色,很多第三方的库也使用NSOperation来实现并发。比如众所周知的AFNetworking这个第三方网络库,就通过自定义NSOperation的方式,将每一个网络请求,封装成为一个Operation,完成各种各样的网络请求和任务管理的需求。

Operation既可以单独使用,也可以和Operation Queue一起使用。

Cocoa operations are an object-oriented way to encapsulate work that you want to perform asynchronously. Operations are designed to be used either in conjunction with an operation queue or by themselves. Because they are Objective-C based, operations are most commonly used in Cocoa-based application in OS X and iOS.

NSOperation是一个抽象类,要实现具体的逻辑功能,必须使用NSOperation的子类来完成。可以自己subclass 一个NSOperation,或者使用系统内置的两个NSOperation的子类来完成相关的功能。

An operation object is an instance of NSOperation class (in the Foundation framework) that you use to encapsulate work you want your application to perform. The NSOperation class itlself is an abstract base class that must be subclassed in order to do any useful work. Despite being abstract, this class does provide a significant amount of infrastructure to minimize the amount of work you have to do in your own subclasses. in addition, the Foundation framework provides two concrete subclasses that you can use as-is with your existing code.

相比GCD,NSOperation的优点有一下几个:

1、可以实现任务之间的相互依赖关系

2、可以检测任务状态的变化

3、可以支持取消操作

4、当任务完成之后,可以通知客户端

5、还可以设置任务的优先级

摘录官方文档描述:

All operation objects support the following key features:

1、Support for the establishment of graph-based dependencies between operation objects.

These dependencies prevent a given operation from running until all of the operations on

which it depends have finished running. For information about how to configure

dependencies, see "Configuring Interoperation Dependencies"

2、Support for an optional completion block, which is executed after the operation‘s main task

finishes. (OS X v10.6 and later only.) For information about how to set a completion block,

see "Setting Up a Completion Block".

3、Support for monitoring changes to the execution state of your operations using KVO

notifications. For information about how to observe KVO notifications, see Key-Value

Observing Programming Guide.

4、Support for prioritizing operations and thereby affecting their relative execution order.

For more information, see "Changing an Operation‘s Execution Priority".

5、Support for canceling semantics that allow you to halt an operation while it is executing.

For information about how to cancel operations, see "Canceling Operations". For information

about how to support cancellation in your own operations, see "Responding to Cancellation

Events".

使用Operation有两个意图:提高程序的并发性,同时也让代码更加简单

Operations are designed to help you improve the level of concurrency in your application.

Operations are also a good way to organize and encapsulate your application‘s behavior into

simple chunks. Instead of running some bit of code on your application‘s main thread, you can

submit one or more operation objects to a queue and let the corresponding work be

performed asynhronously on one or more separate threads.

时间: 2024-10-26 10:08:35

关于Operation 的那些事的相关文章

PL/SQL那点事-->SqlSession operation; SQL []; ORA-01722: 无效数字

PL/SQL那点事-->SqlSession operation;SQL []; ORA-01722: 无效数字 出现这种情况,在网上查了很多方法:大致主要有两种方法帮助我们解决这个问题: 1.将错误行代码找出来,看是不是字符串转化为数字的时候报错,如果是在action层报错,就需要Integer.parseInt(String str)API来解决该问题 如果在action层没有报错,而是显示是Mapper.xml文件报错,那就是和数据库里面的数据类型不一致,这时候就需要to_number(从

Apache无法启动解决 the requested operation has failed

Apache不能启动解决办法 这是我这两天频繁遇到的问题.Apache服务器还真是问题少年!任何点改动都可能导致它无法使用. 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级->WINS标签 把netbios的lmhosts对勾去掉,禁用tcp/ip的netbios. 然后再启动应该就可以了. 原因三:httpd.conf配置错误如果a

Apache无法启动提示the requested operation has failed

主要参考这篇 http://apps.hi.baidu.com/share/detail/15868128 但还是遇到一些问题,记录如下: 1. 配置完成后,restart apache,出现 the requested operation has failed 查看log,有 httpd.exe: Syntax error on line 129 of F:/work_soft/www/server/apache/conf/httpd.conf: Can't locate API module

zabbix服务器执行zabbix_get命令时报错:“zabbix_get [22209]: Timeout while executing operation”

前面刚把Windows平台的zabbix agent安装并启动成功,但是,zabbix的web监控页面显示,还是无法发现这台Windows服务器:大体的意思就是无法连接这台zabbix agent端. 根据之前的经验,我登录到zabbix服务端执行zabbix_get命令进行测试: [[email protected] ~]# zabbix_get -s 10.253.40.64 -p 10050 -k "agent.version" zabbix_get [22209]: Timeo

JVM 内存的那些事

转自:http://blog.jobbole.com/104863/ 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出现,不过也正是因为把内存管理交给了虚拟机,一旦运行中的程序出现了内存泄露问题,给排查过程造成很大困难.所以只有理解了Java虚拟机的运行机制,才能够运筹帷幄于各种代码.本文以HotSpot为例说说虚拟机的那些事. JAVA虚拟机把管理的内存划分为几个不同的数据区. Java堆 Java堆是被所有线程

今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错

今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错 脑子一想这种情况,可以先把原来的目录改一个名字,重新把代码check out下来,再合并提交更新,但这样也太LOW了吧 上网上百度了下,发现了两篇文章,提供了解决方案,我的SVN版本为1.8,实践了方法一,果然奏效了!适用SVN低版本的方法二有待各位尝试了! 解决方案如下: 从SVN库更新项目代码,导致SVN状态异常,更新失败. 通过查阅资料,也有偶尔因为提交代码错误导致的类似问题,都需要在问题路径下执行Clean Up命令

JVM内存的那些事

前言 对于C语言开发的程序员来说,在内存管理方面,必须负责每一个对象的生命周期,从有到无. 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出现,不过也正是因为把内存管理交给了虚拟机,一旦运行中的程序出现了内存泄露问题,给排查过程造成很大困难.所以只有理解了Java虚拟机的运行机制,才能够运筹帷幄于各种代码.本文以HotSpot为例说说虚拟机的那些事. JAVA虚拟机把管理的内存划分为几个不同的数据区. Java堆

[Android开发那点破事]解决android.os.NetworkOnMainThreadException

[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,

linux定时任务crond那些事!

来自老男孩教育的运维班面授课程内容,17期依良同学作业整理而得! 1.定时任务crond介绍 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行. 1.2 为什么要使用crond定时任务 linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能.可以满足周期性执行任务的需求. 1.3 不同系统的定时任务和种类 1.3.1 windows 7 系统的定时任务