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 } }