gpt4 book ai didi

ios - 使用 ReactiveCocoa 在网络 API 调用失败时请求重试

转载 作者:行者123 更新时间:2023-11-28 19:48:41 25 4
gpt4 key购买 nike

我在我的 iOS 应用程序中使用 ReactiveCocoa 来处理网络 API 请求。如果我想显示一个 UIAlertView 并要求用户单击重试按钮,并且仅当用户单击重试按钮时才会重试同一 API 调用,该怎么办?

- (RACSignal*) fetchImportantData {
return [RACSignal createSignal: ^RACDisposable*(id<RACSubscriber> subscriber) {
return [apiCall subscribeNext:^(id x) {
[subscriber sendNext:x];
[subscriber sendCompleted];
} error:^(NSError *error) {
[subscriber sendError:error];
}];
}];
}

最佳答案

这应该可以解决问题。

RACSignal * catchSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
UIAlertView * alertView = [[UIAlertView alloc]
initWithTitle:@"Try again"
message:@""
delegate:nil
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil];
[alertView.rac_buttonClickedSignal subscribeNext:^(NSNumber * buttonIndex) {
if (buttonIndex.integerValue != alertView.cancelButtonIndex)
{
[subscriber sendCompleted];
}
else
{
[subscriber sendError:nil];
}
}];
[alertView show];
return nil;
}];

[[[[[self fetchImportantData] catchTo:catchSignal] repeat] take:1] subscribeNext:^(id x) {
NSLog(@"NEXT: %@", x);
} error:^(NSError *error) {
NSLog(@"ERROR: %@", error);
} completed:^{
NSLog(@"COMPLETED");
}];

所以这里发生的是 fetchImportantData 的错误被 catchTo: 捕获,然后信号被该信号发送的任何内容替换(有点像flattenMap:,但对于错误)。由于我们现在有了控制权,我们可以将 sendCompleted 连接到"is"按钮,并使用 repeat 让信号在完成时重复,同时连接 sendError: 添加到“否”按钮,这样如果用户不想重试,我们可以立即停止所有订阅。

fetchImportantData 最终返回一个非错误时,它将被发送并完全跳过我们的 catchTo: block ,由于我们的 ,信号将完成>take:1.

关于ios - 使用 ReactiveCocoa 在网络 API 调用失败时请求重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473662/

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