Objective c 方法使用相同的参数调用自身

Objective c 方法使用相同的参数调用自身,objective-c,httprequest,afnetworking,Objective C,Httprequest,Afnetworking,我有几个“代理”类,它们继承自“基代理”。这些类连接到我的服务器并将数据传递给它们的代理。如果状态代码为0,我希望以相同的方式处理这些不同的请求 对于0状态代码,我希望在5秒钟内重试该方法,希望用户的internet连接有所改善 某物代理 MyBaseProxy.m -(bool)shouldRetryOperation:(AFHTTPRequestOperation*)o{ 返回self.retries

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

对于0状态代码,我希望在5秒钟内重试该方法,希望用户的internet连接有所改善

某物代理 MyBaseProxy.m
-(bool)shouldRetryOperation:(AFHTTPRequestOperation*)o{
返回self.retries<[self maxreeries];
}
-(void)handleOperationFailed:(AFHTTPRequestOperation*)o action:(ActionBlock)block{
NSInteger statusCode=o.response.statusCode;
如果(状态代码==0){
if([self-shouldRetryOperation:o]){
双延迟频率=5.0;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
调度\u after(popTime,调度\u get\u main\u queue(),^(void){
self.retries++;
block();
});
}否则{
self.retries=0;
[SVProgressHUD淋浴器状态:@“请检查您的internet连接并重试”];
返回;
}
}
self.retries=0;
处理请求失败的更好方法是什么?我应该将AFHTTPRequestOperation子类化吗


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

IMHO,您应该关注的关键情况是,当网络本身不可用于设备时。在这种情况下,您通常会将通知发布到您的当网络可用时应用。如果(a)您知道网络不可用;以及(b)当网络再次可用时,您可以轻松收到通知,则无需重复重试

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

(顺便说一句,403的描述是:“服务器理解请求,但拒绝执行。授权没有帮助,请求不应该重复。”)


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

您应该关注的关键情况,IMHO,是当网络本身对设备不可用时。在这种情况下,您通常会在网络可用时在应用程序上发布通知。如果(a)您知道网络不可用,则无需重复重试;以及(b)当网络再次可用时,您很容易收到通知

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

(顺便说一句,403的描述是:“服务器理解请求,但拒绝执行。授权没有帮助,请求不应该重复。”)


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

对于表示令牌已过期的状态代码,我发布了一条通知,提示用户签署inI。我仅在状态代码0为“无internet连接”时重试。我指的是“相同方式”,我的意思是每个请求,例如,处理所有500个相同,处理所有403个相同。我特别要求处理状态代码0-没有internet连接。@quantumpotato Ok。但我的第一点仍然适用,即您不应该每5秒检查一次。您应该使用可达性,它将在站点可访问时通知您。(AFNetworking的
AFHTTPClient
有一个可供您使用的密码,如果您不想与苹果的可达性代码搏斗的话。)在表示令牌已过期的状态代码上,我发布了一条通知,提示用户签署inI。我只是在状态代码为“无互联网连接”的情况下重试。我的意思是“同一方式”,我的意思是每个请求,例如,处理所有500个相同,处理所有403个相同。我特别要求处理状态代码0-没有互联网连接。@quantumpotato Ok。但我的第一点仍然适用,即您不应该每5秒检查一次。您应该使用可访问性,它将在站点可访问时通知您。(AFNetworking的
AFHTTPClient
有一个
- (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;