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

时间:2015-02-16 18:52:27

标签: ios objective-c reactive-cocoa

在我的应用程序中,我正在使用ReactiveCocoa返回信号,以便在异步api调用完成时成功通知我(成功与否)。在用于保存数据的POST上,一次只需要一个对象:

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

返回RACSignal的函数向订阅者发送下一个:

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

这在保存单个对象时效果很好,但我还有一个场景,我必须保存多个对象。这些对象可以按任何顺序保存(即它们不依赖于彼此)或顺序保存 - 对我来说无关紧要。

我需要更新指示整体进度的UI(保存1的4,保存2的4 ....)以及最终的进度更新(已完成4的4)以及所有已经完成的具体操作处理(成功与否)。

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

2 个答案:

答案 0 :(得分:1)

我在我的应用程序中做了类似的事情,我启动了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]];
}];

随时向我询问有关我使用的任何操作员的问题,我会尽力解释。

答案 1 :(得分:1)

我本人只是在学习ReactiveCocoa,但我想指出一些重要内容,这些内容也同意lightice11的答案。 concat按顺序组合信号。这意味着你不会从#2或#3获得任何东西直到#1完成。另一方面,merge交错响应,无论顺序如何,都会返回接下来的内容。因此,对于您的场景,听起来您确实需要merge

引用这名男子,Justin Spahr-Summers:

  

concat按顺序加入流,merge以尽快值到达为基础加入信号,switch仅传递来自最新信号的事件。< / p>