Я сейчас создаю довольно большое приложение для iPhone.В любом случае, больше, чем я ожидал.Но это не относится к делу, общая идея приложения состоит в том, чтобы извлечь JSON из веб-службы, отсортировать все это по пользовательским объектам NSObject, которые связаны вместе и затем представляют.
Все идет хорошо и хорошо.Но, поскольку я хочу, чтобы пользователь мог видеть эту информацию на устройстве без подключения к Интернету, мне нужно сохранить информацию, которую я представляю, в папке «Документы», которую имеет каждое приложение.
Я в основном реализовалпротокол NSCoding во все пользовательские объекты NSObject, которые могут понадобиться для его сохранения в подкаталоге каталога Documents.
Все это достигается с помощью этой функции здесь.
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Data"];
NSString *dataFileString = [dataPath stringByAppendingPathComponent:@"Company.archive"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataFileString]) //Does directory already exist?
{
MACompany *company = [MACompany sharedMACompany];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Data"];
NSError *error;
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) //Does directory already exist?
{
if (![[NSFileManager defaultManager] createDirectoryAtPath:dataPath
withIntermediateDirectories:NO
attributes:nil
error:&error])
{
NSLog(@"Create directory error: %@", error);
}
}
NSString *dataFileString = [dataPath stringByAppendingPathComponent:@"Company.archive"];
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:company forKey:@"MACompany"];
[archiver finishEncoding];
[[NSFileManager defaultManager] createFileAtPath:dataFileString
contents:data
attributes:nil];
[archiver release];
[data release];
} else {
NSLog(@"File already exists, no need to recreate, not yet anyway");
}
}
Iвыполните следующий запрос, когда пользователь впервые загружает приложение (application didFinishLaunchingWithOptions:
) и когда пользователь открывает приложение, находясь в фоновом режиме (applicationWillEnterForeground:
).
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Data"];
NSString *dataFileString = [dataPath stringByAppendingPathComponent:@"Company.archive"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataFileString]) //Does directory already exist?
{
NSLog(@"Create a new Company Request");
MAWebRequests *companyReq = [[MAWebRequests alloc] init];
[companyReq getCompanyDetails];
[companyReq release];
} else {
NSLog(@"Saved Company Needs to be Decoded applicationWillEnterForeground");
MACompany *company = [MACompany sharedMACompany];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Data"];
NSString *dataFileString = [dataPath stringByAppendingPathComponent:@"Company.archive"];
NSData *data = [[NSData alloc] initWithContentsOfFile:dataFileString];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
company = [unarchiver decodeObjectForKey:@"MACompany"];
[unarchiver finishDecoding];
[unarchiver release];
}
Теперь все работает хорошои я могу вытащить из этого файла также.Но я могу получить данные, хранящиеся в этом файле, только когда отладчик Xcode подключен к приложению.Как только работа остановлена, данные повреждены и не содержат исходных данных.
Там все еще хранятся данные, я вижу созданный файл, но сами данные хранятся в нем.это неправильно ...
Не следует ли использовать вышеупомянутую логику для сохранения данных в файл и затем повторного создания общего объекта?Кто-нибудь еще пытался сделать это и имел успех?Есть ли какая-то причина, почему я сталкиваюсь с этой странной проблемой?Кто-нибудь еще имел эту проблему?
Любая помощь будет принята с благодарностью, пробовал все виды различных методов, чтобы заставить ее работать, и ничто не смогло туда добраться.Все, что мне нужно, - это хранить данные там постоянно, пока мне не понадобится их обновить ...