本文介绍了iOS - 增加AFHTTPRequestOperationManager的超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我从一个非常慢的服务器下载JSON数据。从服务器获取响应大约需要一分钟。我使用AFNetworking库和我的代码抛出请求超时错误:
NSString * urlString = [NSString stringWithFormat:@ %@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString];
NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];
[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];
未找到为 AFHTTPRequestOperationManager
。
解决方案
方法1。
我认为最好的方法是子类 AFHTTPRequestSerializer
并覆盖
<$ (NSString *)方法
URLString:(NSString *)URLString
参数:(NSDictionary *)参数
- (NSMutableURLRequest *)requestWithMethod: / pre>
如下:
- (NSMutableURLRequest *)requestWithMethod :(NSString *)方法
URLString:(NSString *)URLString
参数:(NSDictionary *)参数
{
NSMutableURLRequest * request = [super requestWithMethod:method URLString:URLString parameters :parameters];
[request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];
返回请求;
}
,然后
NSString * urlString = [NSString stringWithFormat:@%@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString];
NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];
[manager setRequestSerializer:YOUR_NEW_REQUEST_SERIALIZER_HERE];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];
[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];
方法2
NSString * urlString = [NSString stringWithFormat:@%@ / account.do?JSON&sysparm_action=getRecords\",baseUrlString];
NSString * login = [[NSUserDefaults standardUserDefaults] objectForKey:@login];
NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@password];
[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password];
NSMutableURLRequest * request = [manager.requestSerializer requestWithMethod:@GETURLString:[[NSURL URLWithString:urlString relativeToURL:manager.baseURL] absoluteString] parameters:nil];
[request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE];
AFHTTPRequestOperation * operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation * operation,id responseObject){
NSLog(@JSON:%@,responseObject);
[self parseJsonWithAccountsData:responseObject];
}失败:^(AFHTTPRequestOperation * operation,NSError * error){
NSLog(@Error:%@,operation.responseString);
[self performSelectorOnMainThread:@selector(failedWithContactsDownload)withObject:nil waitUntilDone:YES];
}];
[manager.operationQueue addOperation:operation];
I'm downloading JSON data from a very slow server. It takes about a minute to get a resoonse from the server. I use AFNetworking library and my code throws "The request timed out" error:
NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString]; NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"]; NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]]; [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password]; [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); [self parseJsonWithAccountsData:responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", operation.responseString); [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES]; }];
Didn't find a way to set a timeout for
AFHTTPRequestOperationManager
. How can I do it?解决方案Method 1.
I think the best way is to subclass
AFHTTPRequestSerializer
and override- (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters
like this:
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters { NSMutableURLRequest *request = [super requestWithMethod:method URLString:URLString parameters:parameters]; [request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE]; return request; }
and then
NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString]; NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"]; NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; [manager setRequestSerializer:YOUR_NEW_REQUEST_SERIALIZER_HERE]; [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password]; [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); [self parseJsonWithAccountsData:responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", operation.responseString); [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES]; }];
Method 2
NSString *urlString = [NSString stringWithFormat:@"%@/account.do?JSON&sysparm_action=getRecords",baseUrlString]; NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"login"]; NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]]; [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:login password:password]; NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:urlString relativeToURL:manager.baseURL] absoluteString] parameters:nil]; [request setTimeoutInterval:YOUR_TIMEOUT_INTERVAL_HERE]; AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); [self parseJsonWithAccountsData:responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", operation.responseString); [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES]; }]; [manager.operationQueue addOperation:operation];
这篇关于iOS - 增加AFHTTPRequestOperationManager的超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!