使用下面的代码,如果没有互联网连接,则会立即触发故障块 - 这很好。但是,如果有连接,但没有互联网呢?
我已阅读此问题: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
}];
}
答案 0 :(得分:20)
只需确定您的应用程序的合理超时间隔,并将其设置在AFHTTPSessionManager请求序列化程序上。
[manager.requestSerializer setTimeoutInterval:20.0];
向您的UI添加内容,例如UIActivityIndicatorView或“正在下载...”消息,以便用户知道发生了什么。
答案 1 :(得分:1)
在Swift中,您可以使用以下代码设置超时。
manager.requestSerializer.timeoutInterval = 25