2014-01-10 4 views
0

У меня есть NSMutableArray объектов, которые я хотел бы сохранить между сеансами пользователя. Каждый объект имеет свойство NSInteger, и я хотел бы иметь доступ ко всем объектам для вычислений с использованием этого свойства (средние значения, mins, maxes и т. Д.)Что такое хороший способ хранения постоянного массива?

Было бы лучше сохранить этот массив в ядре База данных данных или просто хранить мои объекты отдельно в базе данных?

EDIT: массив должен содержать не более 1000 предметов.

+1

это * много * данных (что, вероятно, было бы лучше в Core Data), или это просто * маленькие * данные (которые можно легко записать в файл plist или NSUserDefaults)? –

+0

@MichaelDautermann Я отредактировал мой вопрос. Я не планирую, чтобы массив имел более 1000 объектов. – yiwei

ответ

1

В зависимости от размера. Если это просто просто архивировать массив в файл

Edited добавить

Если все, что вы хотите, чтобы сохраняться массив вам не нужно использовать методы архиваторы, вы можете сделать это непосредственно.

Представьте, что у вас есть URL-адрес файла в каталоге документов вашего приложения с именем persistentURL, который вы хотите использовать для сохранения и чтения вашего массива.

Все, что вам нужно сделать, чтобы сохраняться массив является:

[yourArray writeToURL:persistentURL atomically:YES]; 

И когда вы хотите прочитать данные обратно в массив, это так просто, как:

yourArray = [NSArray arrayWithContentsOfURL:persistentURL]; 

Вы можете использовать это метод здесь, потому что массив содержит только NSNumbers, которые являются объектами списка свойств (т.е. объекты, которые могут быть помещены непосредственно в plist).

+0

Я отредактировал мой вопрос, чтобы уточнить. Массив не будет содержать более 1000 элементов. – yiwei

0

NSArray и NSMutableArray не могут содержать целые числа напрямую. Он должен содержать объекты NSNumber.

В любом случае, я бы просто использовал NSCoding. Попробуйте методы archiveRootObject: toFile: (который записывается непосредственно в файл) или archivedDataWithRootObject (который преобразует содержимое в байтовый поток в NSData).

Для < = 1000 единиц он должен быть достаточно быстрым.

Если вы достаточно хорошо читаете и записываете массив, вы можете захотеть использовать массив массивов malloc'ed с «длинными» и сохранить это как байты в файл. Это было бы быстрее, и вы могли бы легко читать/записывать значения в свой массив C, вместо того, чтобы выполнять замену объекта. С другой стороны, изменение размера массива или вставки значений - это боль с помощью массива C, и вам также нужно знать о размерах данных и проблемах с байтовым порядком, если вы когда-либо передадите эти данные между устройствами.

Редактировать: Я просто написал небольшой тест и написал NSArray из 1000 NSNumbers в файл с archiveRootObject: toFile: занимает около 0.0038 секунд на старом iPhone 4, который у меня есть для тестирования. Это самая медленная машина, которая поддерживает iOS 7, и это 3,8 ТЫСЯЧИ секунды, чтобы написать 1000 пунктов. Поэтому запись массива из 10 000 предметов должна занимать 3,8 сотки секунды или меньше.

Если вы не читаете и не записываете этот массив много раз в секунду, используйте archiveRootObject: toFile: достаточно быстро.

-1

Лично я хотел бы использовать следующие хранить этот массив:

[[NSUserDefaults standardUserDefaults] setObject:myArray ForKey:@"myArray"] 

и получить его в любом месте приложения:

NSMutableArray *myArray = [[[NSUserDefaults standardUserDefaults] objectForKey:@"myArray"] mutableCopy]; 

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

+1

NSUserDefaults не является хорошим выбором для постоянных 1000 NSNumbers. – Abizern

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