1

我有几个“代理”类,它们继承自“基本代理”。这些类连接到我的服务器并将数据传递给它们的代表。如果状态码为 0,我想以相同的方式处理这些不同的请求。

对于 0 状态码,我想在 5 秒内重试该方法,希望用户的互联网连接有所改善。

东西代理.m

- (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];
}

MyBaseProxy.m

- (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 吗?

编辑:删除了令人困惑的文字。当我的意思是“相同的方式”时,我的意思是每个请求,例如。处理所有 500 相同,处理所有 403 相同。我特别要求处理状态代码 0 - 没有互联网连接。

4

1 回答 1

1

恕我直言,您应该关注的关键情况是网络本身对设备不可用时。在这种情况下,您通常会使用Reachability在网络可用时将通知发布到您的应用程序。当 (a) 您知道网络不可用时,重复重试是没有意义的;(b) 当网络再次可用时,您可以很容易地收到通知。

如果您担心特定于服务器的问题,我会小心在 5 秒内发送请求。假设您的服务器不堪重负,无法响应所有客户端请求。让大量客户端每 5 秒重试一次可能不会改善这种情况。这有点取决于您的服务器没有响应的原因。您只想确保再次连接的尝试永远不会使情况变得更糟。

(顺便说一句,403 的描述说,“服务器理解请求,但拒绝执行它。授权无济于事,请求不应重复。”)

如果您要使用重试过程,我会指定一些合理的最大重试次数(根据您修改后的答案判断,您正在这样做)。也许您想要一些东西,当应用程序返回前台时,您重新启动“重试 3 次,每 15 秒一次”逻辑(或您确定的任何内容)。我正在考虑的场景是“用户启动应用程序,超过最大重试次数后失败,然后点击设备上的主页按钮,几分钟/小时后,他们再次点击应用程序(可能仍在运行) 。”

于 2013-07-25T17:08:07.683 回答