如何在AFNetworking 2.0中设置请求超时和caching策略?

我遵循给定的示例代码

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

要更改超时和caching策略,我“侵入”了库并创build

 - (AFHTTPRequestOperation *)GET:(NSString *)URLString parameters:(NSDictionary *)parameters timeoutInterval:(NSTimeInterval)timeoutInterval cachePolicy:(NSURLRequestCachePolicy)cachePolicy success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure { NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters]; [request setTimeoutInterval:timeoutInterval]; [request setCachePolicy:cachePolicy]; AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; [self.operationQueue addOperation:operation]; return operation; } 

有没有干净的方式做到这一点?

我有点懒惰分类或子类。 您可以直接访问经理的请求序列化程序:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer.timeoutInterval = INTERNET_TIMEOUT; manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData; 

最好的是创build一个子类

(你也可以用相同的方式添加caching策略)

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 

使用

 self.requestOperationManager.requestSerializer = [[TimeoutAFHTTPRequestSerializer alloc] initWithTimeout:30]; 

您也可以创build一个类别AFHTTPRequestOperationManager +超时添加此方法,而不必子类AFHTTPRequestOperationManager。

看看方法1一个更清洁的方式来做到这一点: https : //stackoverflow.com/a/21238330/435040

不同的是,我使用的是子类化,而不是修补AFNetworking的代码。

有一件事我忘了提及。 在那个答案我只改变超时间隔,但增加一些其他的caching策略只是一行代码。

尝试像这样:

 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kRequestTimout]; 

其中kRequestTimout是你想要的超时时间

然后build立你的序列化请求:

 NSURLRequest *serializedRequest = [self.requestOperationManager.requestSerializer requestBySerializingRequest:request withParameters:parameters error:&error]; 

并创build并添加您的请求操作:

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:serializedRequest]; [operation setCompletionBlockWithSuccess:successBlock failure:failureBlock]; [self.requestOperationManager.operationQueue addOperation:operation];