IIIAsync
是一个用于管理多个操作顺序执行或并行执行的控制流系统。它可以收集多个操作的结果,无论是对象还是错误。当所有操作完成时,您将获得一个带有结构化结果的完成处理器,无论它们的完成顺序如何。您可以将这些操作在主线程、单个后台线程池或多线程后台池中运行。这使得组织代码和获取结果变得容易,让您构建依赖于多个异步调用的强大高阶操作。
IIIAsync
受杰出的 async.js 库的启发,该库由 Caolan McMahon 编写。
下载代码(无论是独立还是作为子模块)并将 IIIAsync.h
和 IIIAsync.m
包含到您的 Xcode 项目中。
有三个 IIIAsync
单例,用于确定要运行操作的上下文。以下任选一项:
[IIIAsync mainThread]
,[IIIAsync backgroundThreadAsync]
,或[IIIAsync globalAsync]
这些分别在主线程、单个后台线程或全局后台线程上的 dispatch queue 上运行您的代码。
每个都有以下一组 API
-[IIIAsync iterateSerially:withIteratorTask:completionHandler:]
- 遍历数组,逐一在数组每个元素上调用迭代任务,并在迭代完成后执行完成处理程序。保证顺序;每个元素将在前一个元素完成之前不会调用。结果将是返回值的数组和一个可选的错误。-[IIIAsync iterateParallel:withIteratorTask:completionHandler:]
- 遍历数组,在数组每个元素上调用迭代任务,并在迭代完成后执行完成处理程序。不保证顺序。结果将是返回值的数组和一个可选的错误。-[IIIAsync runTasksInSeries:withCompletionHandler:]
- 顺序遍历任务数组,并在遍历完成后执行完成处理程序。保证顺序;每个任务将在前一个任务完成之前不会调用。结果将是返回值的数组和一个可选的错误。-[IIIAsync runTasksInParallel:withCompletionHandler:]
- 并行遍历任务数组,并在遍历完成后执行完成处理程序。不保证顺序。结果将是返回值的数组和一个可选的错误。-[IIIAsync runWhileTrue:performTask:withCompletionHandler:]
- 当条件返回真时执行任务,当条件返回假时执行完成处理器。不返回任何内容和一个可选的错误。-[IIIAsync runWhileFalse:performTask:withCompletionHandler:]
- 当条件返回假时执行任务,当条件返回真时执行完成处理器。不返回任何内容和一个可选的错误。根据API,可以调用几种块类型。
IIIAsyncTask
:接受一个IIIAsyncTaskCompletionHandler
块(见下文)。你将为你的任务向run*:
API提供一个这些块的数组。当任务完成时,你调用IIIAsyncTaskCompletionHandler
块来表示它已经完成。IIIAsyncIteratorTask
:接受一个id
对象,一个表示对象索引的NSUInteger
,和一个IIIAsyncTaskCompletionHandler
块(见下文)。你将为你的操作向iterate*:
API提供一个这个块之一。当每个迭代完成后,你调用IIIAsyncTaskCompletionHandler
块来表示它已经完成。IIIAsyncTaskCompletionHandler
:接受一个id
对象和一个可选的错误。你用操作的结果和一个可选的NSError
调用这个方法,这些将根据需要进行收集。你还实现这个来获取异步操作的结果。IIIAsyncConditional
:不接受任何参数,返回一个BOOL
。你实现这个为runWhile*:
API,以确定何时退出循环。为了我们的目的,我们将假设有一个看起来像这样的方法
-(void)loadImageAtURL:(NSURL *)url handler:(void (^)(UIImage *image, NSError *error))handler;
并行加载三张图像
NSArray *images = @[
[NSURL URLWithString:@"http://placekitten.com/200/300"],
[NSURL URLWithString:@"http://placekitten.com/300/200"],
[NSURL URLWithString:@"http://placekitten.com/450/450"]
];
[[IIIAsync mainThread] iterateParallel:images withIteratorTask:^(id object, NSUInteger index, IIIAsyncTaskCompletionHandler completionHandler){
NSURL *url = (NSURL *)object;
[self loadImageAtURL:url handler:^(UIImage *image, NSError *error){
completionHandler(image, error);
}];
} completionHandler:^(id result, NSError *error){
if(error){
NSLog(@"One of the operations returned an error: %@", error);
}else{
NSArray *images = (NSArray *)result;
NSLog(@"All three images: %@", result);
}
}];
Xcode项目包括一个单元测试套件。你可以通过打开Xcode项目,选择IIIAsync方案,并从产品菜单中选择“测试”来运行它。
除非它们包含足够的、通过单元测试,否则不会考虑任何Pull请求。
tl;dr:MIT许可证,你想做什么就做什么,只要为其提供归档
版权所有(c)2012 Steve Streza
在此特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人,免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、转授和/或销售软件副本来,允许将软件提供给他人以便他们这样做,前提是
上述版权声明和本许可声明应包含在软件的全部或实质部分的副本中。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,不论是由于合同、侵权或其他方式引起的,不论是否与软件或软件的使用或其他交易有关。