У меня возникла проблема с простой реализацией 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];
}
Квотирование соответствующих разделов этих ответов, которые вы связали, полезно. – Machavity
Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Makyen
@Makyen не согласен. Плакат сказал: «NSURLCache нарушен в iOS 8 при использовании NSURLSession» _, который, возможно, «суммирует» связанную статью с сообщением «Я почти уверен, что iOS 8.0 нарушил способность NSURLSession кэшировать данные ответа HTTP» _ – MickyD