测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2014年12月 |
由Gaspard Viot、Jérôme Morissard、Paul-Anatole CLAUDOT、Philippe Bernery维护。
BkTask是一个受< જ delegate patternProactor 和 Reactor设计模式启发的库。它采用异步和模块化两个概念。
异步工作可以保持应用程序的响应性。但是并行编程很难。在iOS中,像GCD和NSOperation这样的工具使得这变得简单多了,但对于复杂的流程,仍需要时间和资源来实现。BkTask允许您简单地运行后台的工作流程,并在完成时通知您。
那么模块化呢?简化复杂任务的一种方法是将它们分解成多个简单的步骤。这就是您使用BkTask构建任务的方式,通过添加需要完成工作流程的步骤。如果您的流程有所变化,您可以添加或删除步骤以更新它。您甚至可以创建自己的步骤,并在不同的工作流程中重用它们。BkTask的模块化特性有助于您保持敏捷。
在技术方面,它使用像NSOperation和键值观察这样的技术。
这个库已经被用于AppStore应用程序中,这些应用程序被数百万的人使用。
v 0.9.1
v 0.9
v 0.8
只需在Podfile中添加以下行
pod 'BkTask'
使用Xcode 4工作区使用BkTask与您的项目是最简单的方法。只需将BkTask.xcodeproj
拖放到工作区中您的其他项目之下。
然后,选择您项目的目标并点击“构建阶段
”标签。展开“链接二进制库
”部分并点击+按钮以添加新库。选择“libBkTask.a
”并点击“添加
”。
由于这是一个静态库,您需要指示BkTask头文件的路径。要做到这一点,选择您项目的目标并点击“构建设置
”标签。找到“头文件搜索路径
”并将路径设置为BkTask的“Classes
”目录。例如,让我们假设您在与`.xcodeproj
相同级别的位置有一个Libraries
目录,其中存储所有外部库。在这种情况下,要指示的头文件是$(SRCROOT)/Libraries/BkTask/Classes
。
任务由多个共享内容的步骤组成。任务监控步骤的执行并确保内容通过步骤传递。当所有步骤完成后,任务通过调用成功块来通知每个注册的观察者。如果某个步骤执行失败,任务通过调用失败块来通知观察者。请注意,成功和失败的观察者可能不同。
步骤从其输入获取数据,对其进行处理,并通过其输出返回结果。每个步骤处理内容并在每个步骤完成后返回。
下面是一些需要注意的事项
首先,添加BkTask导入
#import "BkTask.h"
现在我们可以创建一个简单的任务来从磁盘加载文件
//Create a task
BKTTask *aTask = [[BKTTask alloc] init];
//Create a file load step
BKTFileLoadingOperation *fileLoadOperation = [BKTFileLoadingOperation loadOperationWithFile:FILE_TO_OPEN_URL];
//Add the step to the task
[aTask addStep:fileLoadOperation];
//Set completion and failure blocks
[aTask addTarget:self completion:^(BKTTask *task, id output) {
NSLog(@"Task completed with success");
}];
[aTask addTarget:self failure:^(BKTTask *task, NSError *error) {
NSLog(@"Task failed");
}];
//Start the task
self.myTask = aTask; //To retain the task
[self.myTask start];
当然,只有一个步骤的任务不太有用,GCD在这方面表现得更好。然而,当您有一个包含多个步骤的工作流程时,使用GCD会变得非常混乱,而BkTask负责链式连接步骤并传递数据。
对于常见的用例,有一些辅助方法可用于构建预配置的任务。
// To create a task with a download URL step
+ (id) taskWithRequest:(NSURLRequest *)aRequest;
// To create a task with a download URL step and a JSON parsing step
+ (id) taskWithJSONRequest:(NSURLRequest *)aRequest;
有时,您可能需要在后台执行特定于应用程序的工作。或者您可能想用您最喜欢的JSON解析库中的步骤替换默认的JSON解析步骤。或者简单地说,没有现有步骤来执行您想要的操作。
BkTask提供了多种创建自定义步骤的方式。如果您的步骤相当简单且只使用一次,您可以使用带有描述如何在其步骤中处理数据的块的BkBlockStepOperation
。
+ (id) blockOperationWithInputKey:(NSString *)inKey outputKey:(NSString *)outKey block:(BKTBlockStepOperationBlock)workBlock;
+ (id) blockOperationWithQueue:(NSOperationQueue *)queue block:(BKTBlockStepOperationBlock)workBlock;
+ (id) blockOperationWithBlock:(BKTBlockStepOperationBlock)workBlock;
inKey
和outKey
参数可以接受两个值
BkTaskContentBodyData
表示您的输入(或输出相应)是NSData对象中的二进制数据BkTaskContentBodyObject
表示您的输入(或输出相应)是NSObject子类一个步骤的输出类型必须与下一个步骤的输入相同。否则,任务将无法完成。
为了深入自定义一个步骤,或者如果你需要一个可重复使用的步骤,你可以通过子类化 BKTBasicStepOperation
来实现。步骤是一个实现了 BKTTaskStep
协议的 NSOperation
子类。 BKTBasicStepOperation
是一个抽象类,用于实现一些样板代码,以提供一个更简单的 API 来创建一个类。你唯一需要做的就是重写以下方法
- (NSString *) inputKey;
- (NSString *) outputKey;
- (id) processInput:(id)theInput error:(NSError **)error;
inputKey
和 outputKey
的实现应该返回 BkTaskContentBodyData
或 BkTaskContentBodyObject
,这取决于你的步骤将处理何种类型的输入。然后,processInput: error:
方法是在这里进行输入处理,并返回输出的地方。当然,通过子类化 BKTBasicStepOperation
允许你为配置和处理输入添加任何需要的属性或方法。
如果你创建了一个通用步骤,认为它可能对其他人有用,请随时发送一个 pull request。我们将很乐意考虑并把它添加到 BkTask 中。
示例项目是一个简单的天气预报应用。你可以搜索一个城市并查看相关的预报。它展示了如何创建一个会下载并解析 JSON 的任务。它还展示了如何使用 block 方法向任务中添加一个简单的自定义步骤。要查看 BKTBasicStepOperation
子类化的示例,你可以阅读 BKTJSONParsingOperation
的源代码。
它适用于 iOS 6.1 及以上版本。我们建议使用 Xcode 6.0 或以上版本来构建它。
BkTask 需要iOS 5.0 及以上版本。如果你需要iOS 4.3 兼容性,你可以排除 BkTask 目标中的 BKTJSONParsingOperation
类,这应该是没有问题的。但是,这个提示在未来版本中不一定仍然适用。
构建 BkTask 项目需要 Xcode 5.0。在iOS 7.0 之前无法使用 BKTURLSessionLoadingOperation
。
BkTask 使用自动引用计数(ARC)。
如果你在一个非 ARC 项目中使用 BkTask,你将需要在所有 BkTask 源文件上设置 -fobjc-arc
编译器标志。
要在 Xcode 中设置编译器标志,请转到你的活动目标并选择“构建阶段”标签。现在选择所有 BkTask 源文件,按 Enter,插入 -fobjc-arc,然后按“完成”以启用 BkTask 的 ARC。
如果你使用包含 BkTask 作为工作区项目的一部分的 Xcode 4 工作区,那么你不需要任何特定于 ARC 的配置。
BkTask 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。