В моем приложении я получаю данные URL-адреса с сервера. В качестве оптимизации я нормализую данные, сохраняя их в пользовательском классе, чтобы впоследствии можно было быстро получить к ним доступ. Однако мне нужно хранить экземпляр этого класса локально и в автономном режиме, чтобы избежать получения данных с сервера, если я уже это сделал. Кроме того, веб-сайт меняется ежедневно, поэтому кешированные данные полезны только в том случае, если они относятся к одному и тому же дню.
Этот сценарий применяется к 2 отдельным классам (всего 4 объекта), и я попытался сохранить эти данные с помощью NSCoding. (До сих пор я пытался реализовать только 1 объект, но я планирую создать отдельный docPath для каждого объекта)
- (void) saveStateToDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];
if ([fileMan fileExistsAtPath:docPath])
[fileMan removeItemAtPath:docPath error:&error];
// Store the hours data
Hours *h = [self parseHoursFromServer];
NSDictionary *state = [NSDictionary dictionaryWithObjectsAndKeys:h, @"Hours", nil];
// There are many ways to write the state to a file. This is the simplest
// but lacks error checking and recovery options.
[NSKeyedArchiver archiveRootObject:state toFile:docPath];
NSLog(@"end");
}
- (NSDictionary*) stateFromDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];
if ([fileMan fileExistsAtPath:docPath])
return [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
return nil;
}
Однако, когда я попытался запустить этот код, я получил [Hours encodeWithCoder:]: unrecognized selector sent to instance 0
, потому что мой класс в настоящее время не поддерживает NSCoding. После чтения как мне нужно вручную кодировать все свойства для моего пользовательского класса, я хочу убедиться, что NSCoding является идеальным решением моей проблемы с кэшированием данных.
РЕДАКТИРОВАТЬ:
Вот как я сейчас создаю URL
NSURL *url = [NSURL URLWithString:urlString];
NSData *pageData = [NSData dataWithContentsOfURL:url];
NSURLCache
для этой цели, и что-то вродеNSCoding
имеет смысл. - person Rob   schedule 31.07.2014