如何防止信号在后续异步调用完成之前发送下一个事件?

时间:2015-02-02 23:41:46

标签: ios objective-c reactive-cocoa

我愿意阻止RAC信号在某些后续调用完成之前发送下一个事件消息。

这是我到目前为止的一个例子:

- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate {

    RACSignal* finalSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
        [subscriber sendNext:self.rawDatas];
        [subscriber sendCompleted];
        return nil;
    }];

    return [[[self.apiClient fetchNearbyDatasforLocation:coordinate]            
             flattenMap:^RACStream *(NSArray* datas) {

                    NSMutableArray* signals = [[NSMutableArray alloc] init];
                    self.rawDatas = datas;

                    for (SNPDataModel* data in datas) {
                        RACSignal* fetchExtraDataSignal = [self.apiClient fetchExtraDataInfoForData:data];
                        [signals addObject:fetchExtraDataSignal];
                        RAC(data, extraData) = fetchExtraDataSignal;

                    }

                    // will send a next message when all asynchronous call are completed 
                    RACSignal* completedSignal = [RACSignal combineLatest:signals];

                return completedSignal;
            }]
            flattenMap:^RACStream *(RACTuple* value) {

                return finalSignal;

            }];
} 

关于我的代码的解释很少:我正在尝试获取数据数组并在所有fetchExtraDataSignal信号完成时发送具有相同数组的信号(因此数组现在应该具有额外的数据内容)。是否有更好的反应方式来实现这一目标?如果可能的话,我不想依赖属性数据。

1 个答案:

答案 0 :(得分:1)

虽然我不自信地理解你的意思, 我建议使用&#34; map&#34;而不是&#34; createSignal&#34;和&#34; flattenMap&#34;。

喜欢这个。

- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate {
    return [[self.apiClient fetchNearbyDatasforLocation:coordinate]
        flattenMap:^RACStream *(NSArray* datas)
    {
        /* ... */;
        return [[RACSignal combineLatest:signals]
            map:^(RACTuple *unused) { return datas; }]];
    }];
}

我强烈建议不要使用任何可变字段在事件处理程序之间传递数据。当多个信号同时工作时,这会导致这些结果变得不可预测。