gpt4 book ai didi

ios - 如何使用 Reactive Cocoa 按顺序并行 AFNetworking 请求和处理响应

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:48 25 4
gpt4 key购买 nike

我正在尝试从 5 个不同的 URL 获取 JSON 数据。网络请求可以并行执行,但响应必须按特定顺序处理。另外,我也想有单点的错误处理逻辑。

我现在的代码如下所示。问题是,只调用了 signalFivesignalSix 的订阅。从未调用过所有其他信号的 subscribeNext block 。我怀疑问题是因为订阅发生在 sendNext 发生之后。

是否有更好/标准的方式来执行此类请求?

- (RACSubject *)signalForFetchingFromRemotePath:(NSString *)remotePath
{
RACSubject *signal = [RACSubject subject];

[self.requestOperationManager GET:remotePath parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
for (id obj in responseObject) {
[signal sendNext:obj];
}
[signal sendCompleted];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[signal sendError:error];
}];

return signal;
}

FMDatabase *db = [SomeDatabase defaultDatabase];
[db beginTransaction];

RACSubject *singalOne = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_ONE_PATH]];
RACSubject *singalTwo = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_TWO_PATH]];
RACSubject *singalThree = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_THREE_PATH]];
RACSubject *singalFour = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_FOUR_PATH]];
RACSubject *singalFive = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_FIVE_PATH]];
RACSubject *singalSix = [self signalForFetchingFromRemotePath:[self urlStringWithPath:SYNC_SIX_PATH]];
RACSignal *combined = [RACSignal merge:@[singalOne, singalTwo, singalThree, singalFour, singalFive, singalSix]];

[combined subscribeError:^(NSError *error){
[db rollback];
}];

[singalFive subscribeNext:^(NSDictionary *dict) {
[ClassE save:dict];
} completed:^{
[singalSix subscribeNext:^(NSDictionary *dict) {
[ClassF save:dict];
} completed:^{
[singalOne subscribeNext:^(NSDictionary *dict){
[ClassA save:dict];
} completed:^{
[singalTwo subscribeNext:^(NSDictionary *dict){
[ClassB save:dict];
} completed:^{
[singalThree subscribeNext:^(NSDictionary *dict) {
[ClassC save:dict];
} completed:^{
[singalFour subscribeNext:^(NSDictionary *dict){
[ClassD save:dict];
} completed:^{
NSLog(@"Completed");

[db commit];
}];
}];
}];
}];
}];
}];

最佳答案

如果您需要执行特定顺序,请使用 +concat: 而不是 +merge:

就其本身而言,串联意味着请求不会并行执行。如果您想恢复该行为,您可以在每个信号上使用 -replay(立即启动它),然后再将其传递给 +concat:

顺便说一句,嵌套订阅几乎总是一种反模式。通常有一个内置运算符来执行您想要的操作。

关于ios - 如何使用 Reactive Cocoa 按顺序并行 AFNetworking 请求和处理响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20711390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com