- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Objective-C的NSOperation多线程类基本使用指南由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
nsoperation 。
1、nsoperation 1.简介 nsoperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。 nsoperation本身是抽象基类,因此必须使用它的子类,使用nsoperation子类的方式有2种: 1> foundation框架提供了两个具体子类直接供我们使用:nsinvocationoperation和nsblockoperation 2> 自定义子类继承nsoperation,实现内部相应的方法 。
2.执行操作 nsoperation调用start方法即可开始执行操作,nsoperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。nsoperation对象的isconcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isconcurrent方法默认返回no,表示操作与调用线程同步执行 。
3.取消操作 operation开始执行之后, 默认会一直执行操作直到完成,我们也可以调用cancel方法中途取消操作 。
4.监听操作的执行 如果我们想在一个nsoperation执行完毕后做一些事情,就调用nsoperation的setcompletionblock方法来设置想做的事情 。
或者 。
2、nsinvocationoperation 1.简介 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类 。
。
2.创建并执行操作 。
3、nsblockoperation 1.简介 能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成 。
。
2.创建并执行操作 。
3.通过addexecutionblock方法添加block操作 。
打印信息如下:
。
1
2
3
4
|
2013-02-02 21:38:46.102
thread
[4602:c07] 又执行了1个新的操作,线程:<nsthread: 0x7121d50>{name = (null), num = 1}
2013-02-02 21:38:46.102
thread
[4602:3f03] 又执行了1个新的操作,线程:<nsthread: 0x742e1d0>{name = (null), num = 5}
2013-02-02 21:38:46.102
thread
[4602:1b03] 执行第1次操作,线程:<nsthread: 0x742de50>{name = (null), num = 3}
2013-02-02 21:38:46.102
thread
[4602:1303] 又执行了1个新的操作,线程:<nsthread: 0x7157bf0>{name = (null), num = 4}
|
可以看出,这4个block是并发执行的,也就是在不同线程中执行的,num属性可以看成是线程的id 。
4、自定义nsoperation 1.简介 如果nsinvocationoperation和nsblockoperation对象不能满足需求, 你可以直接继承nsoperation, 并添加任何你想要的行为。继承所需的工作量主要取决于你要实现非并发还是并发的nsoperation。定义非并发的nsoperation要简单许多,只需要重载-(void)main这个方法,在这个方法里面执行主任务,并正确地响应取消事件; 对于并发nsoperation, 你必须重写nsoperation的多个基本方法进行实现(这里暂时先介绍非并发的nsoperation) 。
2.非并发的nsoperation 比如叫做downloadoperation,用来下载图片 1> 继承nsoperation,重写main方法,执行主任务 downloadoperation.h 。
。
downloadoperation.m 。
2> 正确响应取消事件 operation开始执行之后,会一直执行任务直到完成,或者显式地取消操作。取消可能发生在任何时候,甚至在operation执行之前。尽管nsoperation提供了一个方法,让应用取消一个操作,但是识别出取消事件则是我们自己的事情。如果operation直接终止, 可能无法回收所有已分配的内存或资源。因此operation对象需要检测取消事件,并优雅地退出执行 nsoperation对象需要定期地调用iscancelled方法检测操作是否已经被取消,如果返回yes(表示已取消),则立即退出执行。不管是自定义nsoperation子类,还是使用系统提供的两个具体子类,都需要支持取消。iscancelled方法本身非常轻量,可以频繁地调用而不产生大的性能损失 以下地方可能需要调用iscancelled: * 在执行任何实际的工作之前 * 在循环的每次迭代过程中,如果每个迭代相对较长可能需要调用多次 * 代码中相对比较容易中止操作的任何地方 downloadoperation的main方法实现如下 。
。
nsoperationqueue 1、简介 一个nsoperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将nsoperation添加到一个nsoperationqueue(操作队列)中去执行,而且是异步执行的。 创建一个操作队列:
2、添加nsoperation到nsoperationqueue中 1.添加一个operation 。
2.添加一组operation 。
3.添加一个block形式的operation 。
nsoperation添加到queue之后,通常短时间内就会得到运行。但是如果存在依赖,或者整个queue被暂停等原因,也可能需要等待。 注意:nsoperation添加到queue之后,绝对不要再修改nsoperation对象的状态。因为nsoperation对象可能会在任何时候运行,因此改变nsoperation对象的依赖或数据会产生不利的影响。你只能查看nsoperation对象的状态, 比如是否正在运行、等待运行、已经完成等 。
。
3、添加nsoperation的依赖对象 1.当某个nsoperation对象依赖于其它nsoperation对象的完成时,就可以通过adddependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前nsoperation对象才会开始执行操作。另外,通过removedependency方法来删除依赖对象.
依赖关系不局限于相同queue中的nsoperation对象,nsoperation对象会管理自己的依赖, 因此完全可以在不同的queue之间的nsoperation对象创建依赖关系 。
。
唯一的限制是不能创建环形依赖,比如a依赖b,b依赖a,这是错误的 。
2.依赖关系会影响到nsoperation对象在queue中的执行顺序,看下面的例子: 1> 没有设置依赖关系 。
打印信息:
。
1
2
|
2013-02-03 00:21:35.024
thread
[5616:3d13] 执行第1次操作,线程:<nsthread: 0x7658570>{name = (null), num = 3}
2013-02-03 00:21:35.063
thread
[5616:1303] 执行第2次操作,线程:<nsthread: 0x765a2e0>{name = (null), num = 4}
|
可以看出,默认是按照添加顺序执行的,先执行operation1,再执行operation2 。
2> 设置了依赖关系 。
打印信息:
。
1
2
|
2013-02-03 00:24:16.260
thread
[5656:1b03] 执行第2次操作,线程:<nsthread: 0x7634490>{name = (null), num = 3}
2013-02-03 00:24:16.285
thread
[5656:1303] 执行第1次操作,线程:<nsthread: 0x9138b50>{name = (null), num = 4}
|
可以看出,先执行operation2,再执行operation1 。
4、修改operations的执行顺序 对于添加到queue中的operations,它们的执行顺序取决于2点: 1.首先看看nsoperation是否已经准备好:是否准备好由对象的依赖关系确定 2.然后再根据所有nsoperation的相对优先级来确定。优先级等级则是operation对象本身的一个属性。默认所有operation都拥有“普通”优先级,不过可以通过setqueuepriority:方法来提升或降低operation对象的优先级。优先级只能应用于相同queue中的operations。如果应用有多个operation queue,每个queue的优先级等级是互相独立的。因此不同queue中的低优先级操作仍然可能比高优先级操作更早执行。 注意:优先级不能替代依赖关系,优先级只是对已经准备好的 operations确定执行顺序。先满足依赖关系,然后再根据优先级从所有准备好的操作中选择优先级最高的那个执行.
5、设置队列的最大并发操作数量 队列的最大并发操作数量,意思是队列中最多同时运行几条线程 虽然nsoperationqueue类设计用于并发执行operations,你也可以强制单个queue一次只能执行一个operation。setmaxconcurrentoperationcount:方法可以配置queue的最大并发操作数量。设为1就表示queue每次只能执行一个操作。不过operation执行的顺序仍然依赖于其它因素,比如operation是否准备好和operation的优先级等。因此串行化的operation queue并不等同于gcd中的串行dispatch queue 。
6、取消operations 一旦添加到operation queue,queue就拥有了这个operation对象并且不能被删除,唯一能做的事情是取消。你可以调用operation对象的cancel方法取消单个操作,也可以调用operation queue的cancelalloperations方法取消当前queue中的所有操作.
7、等待options完成 为了最佳的性能,你应该设计你的应用尽可能地异步操作,让应用在operation正在执行时可以去处理其它事情。如果需要在当前线程中处理operation完成后的结果,可以使用nsoperation的waituntilfinished方法阻塞当前线程,等待operation完成。通常我们应该避免编写这样的代码,阻塞当前线程可能是一种简便的解决方案,但是它引入了更多的串行代码,限制了整个应用的并发性,同时也降低了用户体验。绝对不要在应用主线程中等待一个operation,只能在第二或次要线程中等待。阻塞主线程将导致应用无法响应用户事件,应用也将表现为无响应.
除了等待单个operation完成,你也可以同时等待一个queue中的所有操作,使用nsoperationqueue的waituntilalloperationsarefinished方法。注意:在等待一个 queue时,应用的其它线程仍然可以往queue中添加operation,因此可能会加长线程的等待时间.
8、暂停和继续queue 如果你想临时暂停operations的执行,可以使用queue的setsuspended:方法暂停queue。不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新operation执行。你可以在响应用户请求时,暂停一个queue来暂停等待中的任务。稍后根据用户的请求,可以再次调用setsuspended:方法继续queue中operation的执行 。
最后此篇关于Objective-C的NSOperation多线程类基本使用指南的文章就讲到这里了,如果你想了解更多关于Objective-C的NSOperation多线程类基本使用指南的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否可以将数据从 NSOperation 传递到下一个 NSOperation 使用的依赖链? 谢谢 克里斯 最佳答案 是的。当前NSOperation可以通过 dependencies 访问它的依赖
我有两个 NSOperation 负责下载和解析。下载操作成功后,我收到一些 NSData 我想将该数据设置为解析操作要使用的数据: init(context: NSManagedObjectCont
我的应用程序获取当前设备位置,将其发布到我的服务器,并返回要在 TableView 中显示的字典。目前我正在使用 CLLocationManager 委托(delegate)方法和 AFJSONReq
我正在编写一个网络连接的应用程序,它需要执行多个异步请求来加载依赖树中较低层所需的数据。 图 1. 出于可视化目的,考虑一个 ASIHTTPRequests A、B、C、D、E 和 F 的示例: A的
我有一个相当简单但昂贵的任务需要在后台运行,这是标准的 NSOperation 情况。我还需要确保该操作支持取消并适当停止。鉴于该要求,哪种方法更好:只是将昂贵的方法调用包装在 NSInvocatio
今天,我在尝试“概括”我的“CoreData 导入操作”时遇到了一个奇怪的问题。看来如果我创建 NSOperation 的通用子类 main() func 不会被调用。 简单的例子: class My
我需要帮助了解如何适当处理以下用例: 假设我正在编写一个聊天应用: 启动应用 请求服务器 (AFHTTPRequestOperation) 给我一个所有新消息的列表 遍历这些消息以查看我是否需要下载任
我想在当前执行的线程上同步执行一个 NSOperation。我可以只调用 [NSOperation start] 吗?这是否总是在当前正在执行的线程中运行? 另一种方法是创建一个 NSOperatio
我有一个应用程序,其中一个长时间运行的进程(> 1 分钟)被放置在 NSOperationQueue(队列 A)上。当队列 A 操作运行时,UI 完全响应,完全符合预期。 但是,我有一种用户可以执行的
我正在使用UIActivityItemProvider子类提供自定义数据。但是有时获取数据失败,并且我不想展示事件(例如消息编写器)。在[self cancel]方法中尝试了return nil;和i
根据关于 NSOperation 的 Apple 文档,我们必须覆盖 main非并发操作的方法和start并发操作的方法。但为什么? 最佳答案 首先,请记住,“并发”和“非并发”在 NSOperati
我正在开发一个 iPad 应用程序。它使用 NSOperation 在后台下载某些内容,并由 NSOperationQueue 处理。我发现,除非我向 NSOperation 添加保留,否则在执行操作
我将创建一系列 NSOperation 并在队列中运行它们。 它们都是按顺序运行的,一次运行一个。 这些操作将从网络获取数据并创建和保存核心数据管理对象。 如何处理应用程序退出的情况?由于操作在分离线
我在 NSOperation 和观察者方面遇到问题。 我有一个 tabbarcontroller 和一个 splashController。我希望启动画面加载并下载文件,并且在下载文件时使 tabba
我正在从 Facebook Connect 获取一些数据(使用 FBConnect Objective-C 2.0 框架),并且我在 NSOperation 中完成所有这些操作。它位于 NSOpera
我正在从NavigationController的 subview 中调用NSOperation。 MyOperation *op = [[MyOperation alloc] target:self
我是iPhone新手。在哪里可以找到NSOperationQueue和NSOperation的示例?NSOperationQueue和NSOperation与线程相比有什么优势? 谢谢 最佳答案 阅读
我对 NSOperations 有疑问。一切正常,但有时(我不知道为什么)操作 block 被简单地跳过。我错过了什么吗?操作怎么可能不是 NSLogging “输入操作”?以下是 viewDidLo
我一直在搜索,但只能找到委托(delegate)模式的想法来从 NSOperation 传回数据。我有一个 NSOperation 在完成该 NSOperation 后下载数据我希望它传递回将其下载的
我正在使用后台操作来发出 URL 请求。如果操作返回错误,如何通知我,然后将相同的操作类型重新添加到队列中以重试? 最佳答案 您可以使用 NSNotification 来实现这一点。创建通知并在请求失
我是一名优秀的程序员,十分优秀!