我愿意阻止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信号完成时发送具有相同数组的信号(因此数组现在应该具有额外的数据内容)。是否有更好的反应方式来实现这一目标?如果可能的话,我不想依赖属性数据。
答案 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; }]];
}];
}
我强烈建议不要使用任何可变字段在事件处理程序之间传递数据。当多个信号同时工作时,这会导致这些结果变得不可预测。