Cocoa 提供了很好的并发管理类,比如NSOperation
和NSOperationQueue
. 您可以使用它们来简化链接异步调用背后的逻辑,而无需在代码中创建显式连接以在工作 2 完成后调用方法 3,在工作 1 完成后调用方法 2,依此类推。使用依赖管理,您可以轻松地指定操作之间的依赖关系。
这是一个如何使用该代码的简单示例。假设您在所有这三个方法中异步下载一些数据,并且您创建了一个NSOperation
名为DownloadOperation
.
首先,创建一个NSOperationQueue
.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
然后,创建三个下载操作。
DownloadOperation *a = [[DownloadOperation alloc] init];
DownloadOperation *b = [[DownloadOperation alloc] init];
DownloadOperation *c = [[DownloadOperation alloc] init];
然后,指定您的操作之间的依赖关系。依赖关系只是说一个操作只有在它所依赖的所有操作都完成时才能运行。在您的示例中,依赖项看起来像c <- b <- a
,可以分为两个步骤:
[b addDependency:a];
[c addDependency:b];
现在将这些操作添加到队列中。
[queue addOperations:@[ a, b, c ] waitUntilFinished:NO];
此时队列将自动开始处理所有操作,但是由于我们已经创建了这种链接类型的依赖项,因此在我们的特定示例中它们将一个接一个地执行。
我在 github 上创建了一个示例项目,在https://github.com/AnuragMishra/ChainedOperationQueue上用一个简单的例子来演示它。它通过创建一个定时器来伪造一个异步操作,当定时器完成时,操作被标记为完成。它是使用 Xcode 4.5 编写的,所以如果您在旧版本中编译它时遇到问题,请告诉我。