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.