使用ReactiveCocoa链接对象数组的asynchronous操作

我有一个实体数组,我想对这些实体执行asynchronous操作。 这些操作应该与数组中的实体按照相同的顺序进行链接和运行。 我是RAC新手。 如何在RAC中做到这一点?

首先,你需要一个包装器方法来执行你的asynchronous操作,这将会返回一个信号。 假设asynchronous操作执行一个完成块。 从它的声音,你不关心的价值观,你想要的副作用,在这种情况下,信号不发送值,它只完成。

- (RACSignal *)asyncOperation { return [RACSignal createSignal:^RACDisposable * (id<RACSubscriber> subscriber) { [self asyncOperationWithCompletion:^{ [subscriber sendCompleted]; }]; return nil; // `nil` means there's no way to cancel. }]; } 

编辑:感谢Justin Spahr-Summers的评论,这里是一个简单的方法来链接操作:

 RACSignal *signal = [RACSignal concat:[array.rac_sequence map:^(id entity) { return [entity asyncOperation]; }]]; 

ReactiveCocoa的+concat:操作符会收集一组信号,并一次订阅一个信号,等待一个信号完成,然后订阅其后继器。 这里使用-rac_sequence是为了将实体映射到操作信号。

在这种情况下, +concat:的使用+concat:实现与下面的我的初始答案链接相同的效果。


使用RAC包装器,一个解决scheme是从一个空信号开始,通过遍历实体和组装操作来build立一个链,使用-then: 在开始下一个操作之前, -then:操作基本上等待以前的操作完成。

 RACSignal *signal = [RACSignal empty]; for (id entity in array) { signal = [signal then:^{ return [entity asyncOperation]; }]; } [signal subscribeCompleted:^{ // At this point, all operations have completed }]; 

在这一点上你有什么是:

 [[[[RACSignal empty] then:^{ return [entity1 asyncOperation]; }] then:^{ return [entity2 asyncOperation]; }] // ... then:^{ return [entityN asyncOperation]; }] 

ReactiveCocoa提供了有用的文档和非常详细的标题,这些对于我来说都是非常有价值的。