Comment puis-je définir un timeout d'attente de requête et une politique de cache dans AFNetworking 2.0?

Je suis le code d'exemple donné

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); }]; 

Pour changer le timeout d'expiration et la politique de cache, j'ai «piraté» la bibliothèque et créé

 - (AFHTTPRequestOperation *)GET:(NSSsortingng *)URLSsortingng 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" URLSsortingng:[[NSURL URLWithSsortingng:URLSsortingng relativeToURL:self.baseURL] absoluteSsortingng] parameters:parameters]; [request setTimeoutInterval:timeoutInterval]; [request setCachePolicy:cachePolicy]; AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; [self.operationQueue addOperation:operation]; return operation; } 

Y a-t-il une façon propre de faire cela?

Je suis un peu paresseux pour catégoriser ou sous-classr. Vous pouvez accéder directement au sérialiseur de requête du gestionnaire:

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

Le mieux est de créer une sous-class

(vous pouvez également append la même stratégie de cache)

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:(NSSsortingng *)method URLSsortingng:(NSSsortingng *)URLSsortingng parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing *)error { NSMutableURLRequest *request = [super requestWithMethod:method URLSsortingng:URLSsortingng parameters:parameters error:error]; if (self.timeout > 0) { [request setTimeoutInterval:self.timeout]; } return request; } @end 

Utilisation

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

Vous pouvez également créer une catégorie AFHTTPRequestOperationManager + timeout pour append cette méthode sans avoir à sous-classr AFHTTPRequestOperationManager.

Jetez un oeil à la méthode 1 pour une façon plus propre de le faire: https://stackoverflow.com/a/21238330/435040

La différence est que j'utilise le sous-classment et que je ne corrige pas le code d'AFNetworking.

Une chose que j'ai oublié de mentionner. Dans cette réponse, je ne fais que changer l'intervalle de timeout, mais append une autre politique de caching est juste 1 ligne de code de plus.

Essayez quelque chose comme:

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

kRequestTimout est la durée d'expiration souhaitée

Ensuite, créez votre requête sérialisée:

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

Et créez et ajoutez votre opération de request:

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