如何防止在后续异步调用完成之前发送下一个事件的信号?
How to prevent a signal to send a next event before subsequent asynchronous calls are completed?
我愿意阻止 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 信号完成时使用相同的数组发送信号(因此该数组现在应该具有额外的数据内容) .有没有更好的反应方式来实现这一目标?如果可能的话,我不想依赖 属性 数据。
虽然我对理解你的意思没有自信,
我建议使用 "map",而不是 "createSignal" 和 "flattenMap" 的组合。
像这样。
- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate {
return [[self.apiClient fetchNearbyDatasforLocation:coordinate]
flattenMap:^RACStream *(NSArray* datas)
{
/* ... */;
return [[RACSignal combineLatest:signals]
map:^(RACTuple *unused) { return datas; }]];
}];
}
而且我强烈建议不要使用任何可变字段在事件处理程序之间传递数据。当多个信号同时工作时,这会导致这些结果变得不可预测。
我愿意阻止 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 信号完成时使用相同的数组发送信号(因此该数组现在应该具有额外的数据内容) .有没有更好的反应方式来实现这一目标?如果可能的话,我不想依赖 属性 数据。
虽然我对理解你的意思没有自信, 我建议使用 "map",而不是 "createSignal" 和 "flattenMap" 的组合。
像这样。
- (RACSignal *) fetchNearbyDatasForLocation: (CLLocationCoordinate2D)coordinate {
return [[self.apiClient fetchNearbyDatasforLocation:coordinate]
flattenMap:^RACStream *(NSArray* datas)
{
/* ... */;
return [[RACSignal combineLatest:signals]
map:^(RACTuple *unused) { return datas; }]];
}];
}
而且我强烈建议不要使用任何可变字段在事件处理程序之间传递数据。当多个信号同时工作时,这会导致这些结果变得不可预测。