2016-02-06 7 views
1

Итак, я нашел небольшую проблему с сохранением массива с помощью writeToFile, чтобы получить его позже. Я использую:Сохранение файлов с помощью writeToFile

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                  NSUserDomainMask, YES); 
     if ([paths count] > 0) 
     { 
      NSString *arrayPath = [[paths objectAtIndex:0] 
         stringByAppendingPathComponent:@"array.out"]; 

      [finalSavedArray writeToFile:arrayPath atomically:YES]; 
      [[NSUserDefaults standardUserDefaults] setObject:arrayPath forKey:@"SavedArrayPath"]; 
      [[NSUserDefaults standardUserDefaults] synchronize]; 
     } 

, чтобы сохранить «finalSavedArray» в виде файла, а затем извлечения этого массива с помощью:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
     NSLog(@"File path: %@",[[NSUserDefaults standardUserDefaults] objectForKey:@"SavedArrayPath"]); 
     NSMutableArray *savedArray = [NSMutableArray arrayWithContentsOfFile:[[NSUserDefaults standardUserDefaults] objectForKey:@"SavedArrayPath"]]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      NSLog(@"SAVED ARRAY:%@",savedArray); 
     }); 

    }); 

Это прекрасно работает, когда я получить доступ к файлу вскоре после его сохранения, но когда Я перезапускаю приложение, и массив выводится как нулевой и, по-видимому, не найден в сохраненной директории. Из небольшого числа чтений кажется, что этот каталог файлов должен быть относительным, так как тот, который я сохраняю в данный момент, меняется каждый раз, когда вы открываете приложение, но я не совсем понял, как изменить свой код чтобы сохранить его в относительном каталоге. Любая помощь будет принята с благодарностью :)

ответ

3

Путь приложения может измениться. Никогда, никогда не сохраняйте абсолютный путь файла. В вашем случае просто сохраните путь относительно папки «Документы».

Если вы хотите прочитать файл, прочитайте относительный путь от NSUserDefaults, а затем перестройте полный путь так же, как и вы, чтобы записать файл.

Запись файла:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
if ([paths count] > 0) 
{ 
    NSString *arrayPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"array.out"]; 

    [finalSavedArray writeToFile:arrayPath atomically:YES]; 
    [[NSUserDefaults standardUserDefaults] setObject:[arrayPath lastPathComponent] forKey:@"SavedArrayPath"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Чтение файла:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *filename = [[NSUserDefaults standardUserDefaults] objectForKey:@"SavedArrayPath"]; 
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:filename]; 
    NSMutableArray *savedArray = [NSMutableArray arrayWithContentsOfFile:path]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     NSLog(@"SAVED ARRAY:%@",savedArray); 
    }); 

}); 
+0

Так что же я должен измениться от того, что я в настоящее время хранить относительный путь вместо абсолютного пути? – RodMatveev

+0

См. Мой обновленный ответ. Это то, что я сказал, что тебе нужно делать. – rmaddy

+0

Спасибо, все работает сейчас :) – RodMatveev

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