2014-12-18 3 views
0

У меня возникла проблема с простой реализацией 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; 
} 

TableViewController:

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

     } 

    } 

} 

APICaller:

- (void)makeAPICallWithCompletionHandler:(void(^)(NSArray *result, NSError *error))completionHandler 
{ 
    NSString *urlString = [NSString string[email protected]"https://api.apiwebsite.com/json/[email protected]", 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]; 
} 

ответ

2

В соответствии с this post и this post NSURLCache сломана прошивкой 8 при использовании NSURLSession.

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

Удачи.

+0

Квотирование соответствующих разделов этих ответов, которые вы связали, полезно. – Machavity

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Makyen

+0

@Makyen не согласен. Плакат сказал: «NSURLCache нарушен в iOS 8 при использовании NSURLSession» _, который, возможно, «суммирует» связанную статью с сообщением «Я почти уверен, что iOS 8.0 нарушил способность NSURLSession кэшировать данные ответа HTTP» _ – MickyD

Смежные вопросы