2009-09-28 3 views
21

Я хотел бы сохранить NSArray как файл или, возможно, использовать настройки по умолчанию. Вот что я надеюсь сделать.Сохранение NSArray

  1. Извлечь уже сохраненный NSArray (если есть).
  2. Сделайте что-нибудь с этим.
  3. Удалить сохраненные данные (если есть).
  4. Сохраните NSArray.

Возможно ли это, и если да, то как мне это сделать?

ответ

38

NSArray предоставляет вам два способа сделать именно то, что вы хотите: initWithContentsOfFile: и writeToFile:atomically:

Короткий пример может выглядеть следующим образом:

//Creating a file path under iOS: 
//1) Search for the app's documents directory (copy+paste from Documentation) 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
//2) Create the full file path by appending the desired file name 
NSString *yourArrayFileName = [documentsDirectory stringByAppendingPathComponent:@"example.dat"]; 

//Load the array 
NSMutableArray *yourArray = [[NSMutableArray alloc] initWithContentsOfFile: yourArrayFileName]; 
if(yourArray == nil) 
{ 
    //Array file didn't exist... create a new one 
    yourArray = [[NSMutableArray alloc] initWithCapacity:10]; 

    //Fill with default values 
} 
... 
//Use the content 
... 
//Save the array 
[yourArray writeToFile:yourArrayFileName atomically:YES]; 
+0

Спасибо! Один вопрос будет 'writeToFile:' создать новый файл с массивом на указанном пути? – Joshua

+1

Да. Одно предупреждение: массив должен быть допустимым списком свойств, а это значит, что все его содержимое (и их содержимое, когда это необходимо) также должны быть списками свойств. –

+0

Я вижу, это должно быть хорошо. Итак, когда я загружаю Array с помощью 'initWithContentsOfFile:' должен ли я предоставить путь непосредственно файлу, и если да, то что он будет вызываться? – Joshua

1

Это может показаться проблемой, наиболее подходящей для Core Data, так как это касается всех постоянных данных объекта. Когда вы извлекаете данные, он возвращает NSSet, который является несортированным, поэтому вам нужно будет каким-то образом сортировать данные в массиве, такие как уникальный номер идентификатора, ассоциированный с каждым созданным вами объектом.

13

Вы могли бы реализовать NSCoding на объектах массив содержит и используйте NSKeyedArchiver для сериализации/десериализации массива на диск.

BOOL result = [NSKeyedArchiver archiveRootObject:myArray toFile:path]; 

Архиватор подчинюсь вашей реализации NSCoding получить сериализуемые значения из каждого объекта и записать файл, который может быть прочитан с NSKeyedUnarchiver:

id myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

Больше информации в serialization guide.

+1

Да. Я хотел бы добавить, что этот способ должен использоваться, если массив содержит данные, не содержащие PropertyList (см. Ответ Racha для дружественных данных PropertyList). –

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