В моем проекте я использую AFNetworking для загрузки данных из Интернета. Я использую NSURLRequestUseProtocolCachePolicy
на моем NSURLRequest
для обслуживания кэшированных данных пользователя (если кеш действителен). Это мой код:Обработка кеша AFNetworking и ответа
Запрос метод: метод
// create NSURL request
NSURLRequest *request = [ServerFactory URLGETRequestWithURL:url];
//creating AFHTTPRequestOperation
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
//set serializaer
operation.responseSerializer = [AFJSONResponseSerializer serializer];
//need to specify that text is acceptable content type, otherwise the error occurs
operation.responseSerializer.acceptableContentTypes = [MyRepository acceptableContentTypes];
//running fetch request async
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//parse data
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//error handling
}];
//start async operation
[operation start];
Допустимые типы контента
+ (NSSet *)acceptableContentTypes
{
return [NSSet setWithObjects:@"application/json", @"text/plain", @"text/html" ,nil];
}
ServerFactory получают методы
+ (NSURLRequest *)URLGETRequestWithURL:(NSString *)URL
{
NSMutableURLRequest *request = [[ServerFactory URLRequestWithURL:URL] mutableCopy];
[request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
[request setHTTPMethod:@"GET"];
return request;
}
+ (NSURLRequest *)URLRequestWithURL:(NSString *)URL
{
// creating NSURL to give to NSURLRequest
NSURL *theURL = [NSURL URLWithString:URL];
//adding service version in http header
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:theURL];
[request addValue:HTTP_HEADER_VERSION_VALUE forHTTPHeaderField:HTTP_HEADER_VERSION_NAME];
//returing request
return request;
}
Теперь я хотел бы перейти к новой логике:
- Получить кэшировать данные
- Если кэшированные данные действительны
- Подавать пользователю кэшированных данных
- диспетчерский новый запрос с If-Modified-Since заголовка установлен извлеченной отметки времени в кэше данных
- Сервер respondes 304 Not Modified если кэш еще хорошо, или 200 OK, если есть новые данные
- обновления пользовательского интерфейса с новыми данными
- Если экс данные кэша pired
- Получить новые данные из Интернета
Поэтому в основном я хотел бы служить кэшированные данные, но проверить, если мой кэшированные данные по-прежнему действует на сервере, или если есть новые данные для загрузки. Есть ли способ достичь этого? Я пробовал с setCacheResponseBlock
на AFHTTPRequestOperation
, но я не могу получить кешированную метку данных. Есть ли более «разумный» способ сделать это?
Я использую AFNetworking 2.0 – paxx
Отметьте эту тему, это может вам помочь: http://stackoverflow.com/a/21556002/514181 – Darrarski