如何在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];
- 如何使用AFOAuth2Manager自动刷新过期的标记?
- 当应用程序在后台时是否可以使用NSFileManager的`copyItemAtURL:toURL:error:`方法?
- JSONparsing后–viewForAnnotation在MKMapView上只显示一个单一的注解
- 从AFNetworking直接获取NSData,而不是让它转换为UIImage
- 使用AFNetworking发送多个图像
- AFNetworking预取其他图像
- 使用networking传递在GET方法中传递参数
- 如何使用AFNetwork的AFHTTPRequestOperationManager设置HTTP请求正文?
- AFnetworking waitUntilFinish不起作用