¿Cómo configuro un time de espera de request y una política de caching en AFNetworking 2.0?

Estoy siguiendo el código de ejemplo dado

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

Para cambiar el time de espera y la política de caching, he "pirateado" la biblioteca y he creado

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

¿Hay una manera limpia de hacer esto?

Soy un poco perezoso para clasificar o subclass. Puede acceder directamente al serializador de requestes del administrador:

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

Lo mejor es crear una subclass

(también puede agregar la misma política de 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 

Utilizar

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

También puede crear una categoría AFHTTPRequestOperationManager + timeout para agregar este método sin tener que subclass AFHTTPRequestOperationManager.

Eche un vistazo al método 1 para get una manera más limpia de hacerlo: https://stackoverflow.com/a/21238330/435040

La diferencia es que estoy usando subclasss y no estoy parcheando el código de AFNetworking.

Una cosa que olvidé mencionar. En esa respuesta, solo estoy cambiando el intervalo de time de espera, pero agregar otra política de caching es solo una línea de código más.

Prueba algo como:

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

donde kRequestTimout es la duración de time de espera que desea

Luego crea tu request serializada:

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

Y cree y agregue su operación de request:

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