我有几个“代理”类,它继承自“基本代理”。这些类连接到我的服务器并将数据传递给他们的代理。如果是0状态代码,我想以同样的方式处理这些不同的请求。
对于0状态代码,我想在5秒内重试该方法,希望用户的互联网连接有所改善。
- (void)fetchSomething {
NSString *fullPath = [NSString stringWithFormat:@"%@/route/index.json",MY_BASE_URL];
NSURL *url = [NSURL URLWithString:fullPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *d = (NSDictionary *)responseObject;
[self.delegate fetchedPolicy:d[@"keypath"]];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self handleOperationFailed:operation action:^{
[self fetchSomething];
}];
}];
NSOperationQueue *q = [[NSOperationQueue alloc] init]; [q addOperation:operation];
}
- (bool)shouldRetryOperation:(AFHTTPRequestOperation *)o {
return self.retries < [self maxRetries];
}
- (void)handleOperationFailed:(AFHTTPRequestOperation *)o action:(ActionBlock)block {
NSInteger statusCode = o.response.statusCode;
if (statusCode == 0) {
if ([self shouldRetryOperation:o]) {
double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
self.retries++;
block();
});
} else {
self.retries = 0;
[SVProgressHUD showErrorWithStatus:@"Please check your internet connection and try again"];
return;
}
}
self.retries = 0;
处理请求失败的更好方法是什么?我应该将AFHTTPRequestOperation子类化吗?
编辑:删除了令人困惑的文字。当我的意思是“相同的方式”时,我的意思是每个请求例如。处理所有500s相同,处理所有403s相同。我特别要求处理状态代码0 - 没有互联网连接。
答案 0 :(得分:1)
你应该关注的关键情况,恕我直言,当网络本身无法供设备使用时。在这种情况下,您通常会使用Reachability在网络可用时向您的应用发布通知。当(a)您知道网络不可用时,反复重试没有意义; (b)当网络再次可用时,您可以轻松收到通知。
如果您担心特定于服务器的问题,我会在5秒内发送请求。我们假设您的服务器不堪重负,无法响应所有客户端请求。让大量客户端每5秒重试一次可能无法改善这种情况。这有点取决于您的服务器没有响应的原因。你只是想确保重新连接的尝试永远不会使情况变得更糟。
(顺便说一句,403的说明,&#34;服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。&#34;)
如果您要使用重试过程,我会指定一些合理的最大重试次数(根据您修改的答案判断,您正在进行重试)。也许你想要的东西,当应用程序返回到前台时,你重新启动你的&#34;重试三次,每15秒一次&#34;逻辑(或任何你定居的)。我想到的情景是&#34;用户启动应用程序,超过最大重试次数失败,然后点击设备上的主页按钮,几分钟/小时后,他们再次点击应用程序(可能还在运行。&#34;