example afhttprequestoperation ios objective-c afnetworking afnetworking-2

ios - afhttprequestoperation - afnetworking example



¿Cómo configuro un tiempo de espera de solicitud y una política de caché en AFNetworking 2.0? (5)

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 tiempo de espera y la política de caché, "hackeé" la biblioteca y la creé.

- (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?


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

La diferencia es que estoy usando subclases y no estoy parchando el código de AFNetworking.

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


Intenta algo como:

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

donde kRequestTimout es el tiempo de espera que desea

Luego construya su solicitud serializada:

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

Y crea y agrega tu operación de solicitud:

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


Lo mejor es crear una subclase.

(También puede agregar la misma política de caché)

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


Soy un poco perezoso para categorizar o subclase. Puede acceder directamente al serializador de solicitudes del administrador:

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


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