Что я делаю неправильно?NSFileManager горе - PullRequest
1 голос
/ 03 ноября 2011

Я сейчас создаю довольно большое приложение для 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 подключен к приложению.Как только работа остановлена, данные повреждены и не содержат исходных данных.

Там все еще хранятся данные, я вижу созданный файл, но сами данные хранятся в нем.это неправильно ...

Не следует ли использовать вышеупомянутую логику для сохранения данных в файл и затем повторного создания общего объекта?Кто-нибудь еще пытался сделать это и имел успех?Есть ли какая-то причина, почему я сталкиваюсь с этой странной проблемой?Кто-нибудь еще имел эту проблему?

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

1 Ответ

0 голосов
/ 09 ноября 2011

Я решил эту проблему, сохранив объект MACompany задолго до applicationDidEnterBackground:

Большое спасибо @OleBegemann за его помощь в поиске места, где вложена проблема.

...