如何知道何时使用 ReactiveCocoa 异步保存所有对象

How to know when all objects are saved asynchronously using ReactiveCocoa

在我的应用程序中,我使用 ReactiveCocoa 来 return 发出信号,以便在异步 api 调用完成(成功与否)时通知我。在保存数据的POST上,一次只取一个对象:

- (RACSignal *)postJSONData:(NSDictionary *)dict toRelativeURL:(NSString *)urlString;

returnRACSignal 向订阅者发送下一个的函数:

[subscriber sendNext:json]或错误:[subscriber sendError:jsonError].

这在保存单个对象时效果很好,但我也遇到了必须保存多个对象的情况。这些对象可以按任何顺序(即它们彼此不依赖)或按顺序保存 - 这对我来说无关紧要。

我需要更新 UI 指示总体进度(4 个中保存 1 个,4 个中保存 2 个....)以及最终进度更新(4 个中完成 4 个)和具体操作当所有的都被处理(成功与否)时采取。

有很多方法可以做到这一点,但我想以正确的方式使用 ReactiveCocoa 来做到这一点。我在想我可以用 concat:then:rac_sequence map:^ 来做到这一点,但我不确定。在他们的 github 页面上,他们展示了一个解决并行工作流的示例,但他们使用了 2 个离散定义的信号。在循环遍历需要保存的每个对象之前,我不会收到信号。会喜欢一些指导或例子(甚至更好!)。提前致谢。

我正在我的应用程序中做类似的事情,我启动了 3 个不同的异步网络调用并将它们全部组合成一个我可以收听的信号。基本上我遍历我所有的对象并将网络信号存储在一个数组中。然后我调用 merge: 并将网络信号数组传递给它。

NSMutableArray *recievedNames = [NSMutableArray new];
NSMutableArray *signals = [NSMutableArray new];

//go though each database that has been added and grab a signal for the network request
for (GLBarcodeDatabase *database in self.databases) {
    [signals addObject:[[[[self.manager rac_GET:[database getURLForDatabaseWithBarcode:barcode] parameters:nil] map:^id(RACTuple *value) {
        return [((NSDictionary *)value.second) valueForKeyPath:database.path];
    }] doError:^(NSError *error) {
        NSLog(@"Error while fetching name from database %@", error);
    }]
}

//forward all network signals into one signal
return [[[RACSignal merge:signals] doNext:^(NSString *x) {
    [recievedNames addObject:x];
}] then:^RACSignal *{
    return [RACSignal return:[self optimalNameForBarcodeProductWithNameCollection:recievedNames]];
}];

如有任何关于我使用过的运算符的问题,请随时向我提问,我会尽力解释它们。

我自己正在学习 ReactiveCocoa,但我想指出一些重要的事情,这也与 lightice11 的回答一致。 concat 按顺序组合信号。这意味着在#1 完成之前,您不会从#2 或#3 获得任何东西。 merge 另一方面,无论顺序如何,都会交错返回接下来的响应。因此,对于您的情况,听起来您确实想要 merge.

引用 Justin Spahr-Summers 的话:

concat joins the streams sequentially, merge joins the signals on an as-soon-as-values-arrive basis, switch only passes through the events from the latest signal.