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]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", operation.responseString); [self performSelectorOnMainThread:@selector(failedWithContactsDownload) withObject:nil waitUntilDone:YES]; }];
没有find一种方法来设置AFHTTPRequestOperationManager
超时。 我该怎么做?
方法1。
我认为最好的办法是子类AFHTTPRequestSerializer
和覆盖
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters
喜欢这个:
- (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; }
接着
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]; }];
方法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];
在AFNetworking 2库中, AFHTTPRequestSerializer
有方法AFHTTPRequestSerializer
设置请求超时间隔。
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.requestSerializer setTimeoutInterval:TIME_OUT_INTERVAL]; [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]; }];
您不需要重写该类来设置请求超时间隔。
我有点懒惰分类或子类。 您可以直接访问经理的请求序列化程序:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer.timeoutInterval = INTERNET_TIMEOUT; manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
创build一个子类
self.requestOperationManager.requestSerializer = [[TimeoutAFHTTPRequestSerializer alloc] initWithTimeout:30];
TimeoutAFHTTPRequestSerializer.h
#import "AFURLRequestSerialization.h" @interface TimeoutAFHTTPRequestSerializer : AFHTTPRequestSerializer @property (nonatomic, assign) NSTimeInterval timeout; - (id)initWithTimeout:(NSTimeInterval)timeout; @end
TimeoutAFHTTPRequestSerializer.m
#import "TimeoutAFHTTPRequestSerializer.h" @implementation TimeoutAFHTTPRequestSerializer - (id)initWithTimeout:(NSTimeInterval)timeout { self = [super init]; if (self) { self.timeout = timeout; } return self; } - (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing *)error { NSMutableURLRequest *request = [super requestWithMethod:method URLString:URLString parameters:parameters error:error]; if (self.timeout > 0) { [request setTimeoutInterval:self.timeout]; } return request; } @end
实际上, timeoutInterval
属性的值被忽略 – 我通过debugging方法requestWithMethod:URLString:parameters:error:
检查requestWithMethod:URLString:parameters:error:
我设法子类和重写方法(Swift)
class RequestSerializer: AFHTTPRequestSerializer { override func requestWithMethod(method: String!, URLString: String!, parameters:AnyObject!, error: NSErrorPointer) -> NSMutableURLRequest { var req = super.requestWithMethod(method, URLString: URLString, parameters: parameters, error: error) req.timeoutInterval = self.timeoutInterval return req } }