如何在AFNetworking的AFHTTPSessionManager中超时或检测慢响应?

时间:2014-06-24 11:40:55

标签: ios objective-c afnetworking

使用下面的代码,如果没有互联网连接,则会立即触发故障块 - 这很好。但是,如果有连接,但没有互联网呢?

我已阅读此问题:How to set a timeout with AFNetworking建议使用reachabilityManager,此答案中的示例显示了使用 - AFNetworking 2.0 queue request when device is offline with setReachabilityStatusChangeBlock does nothing

但是,如果我的模拟器或手机连接到我的wifi网络但没有互联网访问(DNS,DHCP或调制解调器问题),我的代码目前仍在尝试长时间访问我的API。我没有下载任何东西,我知道我的脚本和我的服务器应该在几秒钟内响应,所以我知道在5秒不活动后,出现问题。

我可以安全地执行超时,还是可以在当前脚本中使用reachabilityManager来检测脚本(而不是Internet)是否无法访问,如果是,如何?

- (void)APICall:(NSMutableDictionary*)params {

    NSURL *baseURL = [NSURL URLWithString:BaseURLString];
    NSDictionary *parametersGetAuthCode = @{@"req": @"getauth"};

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];

    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager POST:APIscript parameters:parametersGetAuthCode success:^(NSURLSessionDataTask *task, id responseObject) {
        if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
            NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response;
            if ([r statusCode] == 200) {

            //do success stuff

            }
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alertView show];

        //do failure stuff

    }];

}

2 个答案:

答案 0 :(得分:20)

只需确定您的应用程序的合理超时间隔,并将其设置在AFHTTPSessionManager请求序列化程序上。

[manager.requestSerializer setTimeoutInterval:20.0];  

向您的UI添加内容,例如UIActivityIndi​​catorView或“正在下载...”消息,以便用户知道发生了什么。

答案 1 :(得分:1)

在Swift中,您可以使用以下代码设置超时。

manager.requestSerializer.timeoutInterval = 25