Как установить время ожидания запроса и политику кэширования в AFNetworking 2.0?

Я следую приведенному примеру кода

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

Чтобы изменить политику тайм-аута и кэширования, я «взломал» библиотеку и создал

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

Есть ли чистый способ сделать это?


person joao    schedule 13.11.2013    source источник
comment
Чистый способ, чтобы ваш собственный класс расширил AFHTTPRequestOperationManager и добавил метод в этот класс.   -  person rckoenes    schedule 13.11.2013
comment
Это действительно хорошее замечание... Я пока так и сделаю.   -  person joao    schedule 13.11.2013
comment
Нет более чистого способа. Служебные методы лаконичны и не включают в себя все параметры, которые вы, возможно, захотите установить.   -  person David Snabel-Caunt    schedule 13.11.2013


Ответы (5)


Я немного ленив, чтобы классифицировать или подкласс. Вы можете получить доступ к сериализатору запросов менеджера напрямую:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer.timeoutInterval = INTERNET_TIMEOUT;
manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
person LordParsley    schedule 05.08.2014

Лучше всего создать подкласс

(вы также можете таким же образом добавить политику кэширования)

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];
person Peter Lapisu    schedule 01.02.2014

Вы также можете создать категорию AFHTTPRequestOperationManager+timeout, чтобы добавить этот метод без создания подкласса AFHTTPRequestOperationManager.

person Pierre Marty    schedule 15.01.2014

Взгляните на Метод 1, чтобы найти более чистый способ сделать это: https://stackoverflow.com/a/21238330/435040

Разница в том, что я использую подклассы и не исправляю код AFNetworking.

Одна вещь, которую я забыл упомянуть. В этом ответе я меняю только интервал времени ожидания, но добавление какой-либо другой политики кэширования — это всего лишь еще одна строка кода.

person arturgrigor    schedule 20.01.2014

Попробуйте что-то вроде:

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

где kRequestTimout - желаемая продолжительность тайм-аута

Затем создайте сериализованный запрос:

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

И создайте и добавьте свою операцию запроса:

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