Простая реализация NSURLCache на iOS8

У меня возникли проблемы с простой реализацией NSURLCache, работающей на iOS8. Насколько я понимаю, после создания общего кэша он автоматически кэширует запросы данных с соответствующей политикой кэширования. Никакой настройки не требуется, если вы не хотите настраивать поведение. Это правильно?

Я включил упрощенную версию моего кода ниже. Кэш создается в AppDelegate, а TableViewController, которому нужны данные, использует объект APICaller для выполнения вызова. Запрос использует NSURLRequestReturnCacheDataElseLoad, так как эту информацию не нужно часто обновлять.

Если я далеко от цели здесь. Какой следующий шаг? Полученные данные составляют 95 КБ.

AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
    [NSURLCache setSharedURLCache:URLCache];


    return YES;
}

Таблевиевконтроллер:

- (void)viewDidLoad {

  APICaller *apiCaller = [APICaller alloc] init];
  [apiCaller makeAPICallWithCompletionHandler:^(NSArray *result, NSError *error){
    if (error) {

      // Handle error
    } else {
    self.property = [result mutableCopy];
    [self.tableView reloadData];

      }

    }

}

APIВызывающий:

- (void)makeAPICallWithCompletionHandler:(void(^)(NSArray *result, NSError *error))completionHandler
{
    NSString *urlString = [NSString stringWithFormat@"https://api.apiwebsite.com/json/query?key=@", API_KEY];
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
    NSURLSessionConfiguration *config = [NSURLSession defaultSessionConfiguration];
    self.urlSession = [URLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

    NSURLSessionDataTask *dataTask = [self.URLSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
        NSLog(@"There was an error");
        dispatch_async(dispatch_get_main_queue(), ^{
            completionHandler(nil, error);
        });
    } else {

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
        NSArray *sortedResult = [dict[@"result"] sortedArrayUsingDescriptors:sortDescriptors];

        dispatch_async(dispatch_get_main_queue(), ^{
            completionHandler(sortedResponse, error);
        });
      }

    }];

    [dataTask resume];
}

person Ja5onHoffman    schedule 18.12.2014    source источник


Ответы (1)


Согласно этот пост и этот пост NSURLCache не работает в iOS 8 при использовании NSURLSession.

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

Удачи.

person cschandler    schedule 27.02.2015
comment
Цитирование соответствующих разделов этих ответов, на которые вы ссылаетесь, полезно. - person Machavity♦; 28.02.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Makyen♦; 28.02.2015
comment
@Makyen Не согласен. Постер сообщил, что NSURLCache не работает в iOS 8 при использовании NSURLSession, что, возможно, does summarise связано со статьей, в которой говорится, что я почти уверен, что iOS 8.0 нарушила способность NSURLSession кэшировать данные HTTP-ответа - person MickyD; 01.03.2015