OperationsRunner 3.1.2

OperationsRunner 3.1.2

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布上次发布2014年12月

David Hoerl维护。



  • David Hoerl

FastEasyConcurrentWebFetches (TM)

一个用以管理网络操作池的基础设施,由三个类构成;优雅、简单且可快速取消。基于早于 GCD 的项目(NSOperation-WebFetches-MadeEasy),提供了一个轻量级的框架来运行多个 NSURLConnection(或需要代理的其他操作:iOS5 代码),同时在用户点击后退按钮时能够取消和清理。

用户创建 WebFetcher(或其子类)的新实例,设置其属性,然后使用"[self runOperation:op runMsg:@"Some message to assist in debugging"]"逐个或成批提交。操作完成后,您将在代理调用中得到它"- (void)operationFinished:op count:remaininggCount",在哪里您可以查看它是否成功,返回的 htmlStatus,取回数据或查看是否有错误(NSError)。'remainingCount'主要用来在所有未完成操作都已完成后通知您,关闭旋转器并重新启用 UI。在 Lot18,我创建了大约一打 WebFetcher 的子类,每个子类都针对特定的 REST 交互类型。子类通常不超过几十行代码,并建立在核心基础设施之上。

此项目包括一个使用硬编码的网络获取器的 GUI 测试框架,它使用 HTTP GET 从公共 Dropbox 文件夹下下载图像。三个核心类位于 WhatYouNeed 文件夹中,OperationsRunner.h 头文件列出了将它们采纳到项目中所需的一小部分指令。

演示应用提供了更改并发操作数量、优先级(目标队列)和总数的控件。一旦这些控件激活,您就可以取消它们,或点击“后退”按钮,以查看您能够多快地取消和清理。在编译时加入的新标志会加入一个验证步骤,以确保所有操作都已经释放。

这些代码是从 NSOperation-WebFetches-MadeEasy 迁移过来的,是 Lot18 应用(5星级评价)的基础,这个应用经常需要运行成百个获取器来获取产品信息、图像以及发布用户更新。

更新

3.1.0 (2/9/2014): 会话重构 - 64位清洁 - 将 ORSessionDelegate 移动到 RefSessionDelegate,将 URSessionDelegate 移动到 ORSessionDelegate。您的子类应该使用 ORSessionDelegate 作为基类。RefSessionDelegate 旨在在您需要时提供所有代理方法的方法模板。 - 几项调整以提高数据处理效率。 - 现在此代码被用于我的许多项目,包括一个正在向多个第三方发送的企业框架。 - 保留 iOS6 代码以供历史原因,但不再维护。 - 添加适用于 CocoaPods 的 podspec

3.0 (2013年9月6日):支持iOS7 - 修改了组件以使用NSURLSession(数据任务模式,尚未启用后台转换)。- OperationsRunner的接口保持不变,新增了一个创建共享NSURLSession、连接对象、代理和代理队列的类方法。- 对WebFetcher做了少量修改,由于许多功能迁移到了共享代理(ORSessionDeleage/URSessionDelegate),它实际上变得更小了。在代理中添加了大量的NSLog语句,所有这些都实现了ORSessionDelegate,以便于复制粘贴到URSessionDelegate [得到它 UR == Your]。

2.2 (2013年5月10日):修复竞态条件 - finalBlock可能在操作完成之前运行 + finish。现在这些操作序列化了。

2.1 (2013年5月9日):在数小时内通过了数千次单元测试 - 继续优化,以确保iOS5和iOS6的所有8个测试在数千次测试迭代中都能通过。
为所有类提供MACRO名称(穷人版的命名空间)来避免潜在的命名冲突,更好地支持库的使用 - 测试应用现在启用了dealloc测试,以确保无论操作是否完成或取消,最终都会释放。

2.0 (2013年5月6日):使用单元测试进行了大量重写 - 创建了两个文件夹的所需文件,一个是iOS5的,另一个是iOS6的 - iOS5使用现有的runloop睡眠,并且已经从NSOperations迁移到纯块 - 标有iOS5的代码在iOS6中仍然有效,但iOS6的特定代码应该需要更少的资源 - iOS6删除了并发操作,使用WebFetchers作为基操作类,并使用现在工作的setDelegateQueue:方法进行代理回调 - 8个对iOS5和iOS6都有效的单元测试 - 集成步骤从6减少到4,甚至不再需要ivar。

1.1 (2013年4月23日):改进了诊断 - 新的编译时标志VERIFY_DEALLOC执行最终测试以确保所有操作都已dealloced - 新的'start'方法消除了在'setup'方法中发送'connect:'消息的需要。

1.0 (2013年4月21日):首次发行 - 将NSOperation-WebFetches-MadeEasy代码从NSOperationQueues转换为GCD,保留了90%的旧API - 向ConcurrentOperations添加了新的'start'方法,以便任何子类都可以执行必要的功能。

简介

大多数涉及管理并发NSURLConnection池的复杂性都转移到了辅助类OperationsRunner。通过添加一个类的方法,使用一些其方法,并实现一个协议方法,您只需付出微小的努力即可获得所有后台网络提取的好处。当每个操作完成时,它会在唯一协议方法中向您的调用类发送消息,并供应剩余的操作数。当该值变为零时,所有操作都已完成,然后您可以停止使用任何旋转器或使用其他指示器。默认回复消息是在主线程上的,但您可以指定特定的线程,允许任何线程,或提供dispatch serial queue(和可选组)。

此项目还提供了一个基类,用于处理所有网络交互的复杂性。该基类的最终子类URfetcher与您自己编写的类似。

演示

运行包含的 проект,并行下载我DropBox公共文件夹中的文件。

使用方法

  • 将OperationsRunner和ConcurrentOp添加到您的项目中

  • 查看OperationsRunner.h中的说明,并根据说明添加各种包含和代码

操作

当您想要获取一些数据时,您创建一个新的WebFetcher对象,提供一个资源(如图片)的URL,然后向您的类发送消息如

[self runOperation:op withMsg:@"Tracking string"];

消息参数可以接受任意的字符串或nil,但是我强烈建议您使用唯一的描述性值。当启用调试时,该字符串在操作运行时会记录下来。

操作完成时,它将在主线程上(除非您已另外配置)向您的类发送以下消息

[myClass operationFinished:(NSOperation *)op count:(NSUInteger)remainingCount];

请注意,您甚至不必创建 OperationsRunner —— 通过使用 NSObject 方法 "forwardingTargetForSelector",OperationsRunner 仅在收到第一条消息时才被创建。此方法还确保了那些 destined for it 的小消息得到正确路由。

假设您需要取消所有操作,可能是因为用户点击了“后退”按钮。只需向您的类发送消息:

[operationsRunner cancelOperations];

甚至不用这么做!如果您有正在进行的操作,当您的类的 dealloc 被调用时,OperationsRunner 也会 dealloc,并正确地关闭了正在进行的操作。

"operationFinished:count" 方法返回剩余的操作计数,您可以在此数降到零时退休一个 spinner。

注意:

1) 设计 'forwardingTargetForSelector' 的原因是可以容易地将它结合到一个 UIVIewController 基础子类中,子类可以使用 "self" 完全访问该功能。

2) 将此添加到基础类不会消耗任何资源,因为对象只有在使用时才会创建。

3) 将类别接口定义添加到一个类的接口文件中,其他对象也可以直接向它发送操作。