Есть ли лучший способ положить кучу вещей в NSUserDefaults? - PullRequest
6 голосов
/ 25 июня 2009

Я в замешательстве по поводу NSUserDefaults на iPhone.

Я родом из C / asm, а материал Objective-C стал опытом обучения.

В настоящее время я использую NSUserDefaults для хранения некоторых строк (для имен в таблице рекордов). Я хочу начать реализовывать функцию типа «Сохранить игру», чтобы, если пользователь на мгновение получает вызов или выходит из игры, он мог вернуться к нему.

Чтобы восстановить игру, у меня есть пара BOOL флагов, пара int s для хранения некоторых необходимых переменных, но я застрял в массиве, который мне нужно сохранить.

У меня есть массив из 50 элементов unsigned char с. Я мог бы переместить его в int s, если бы это облегчало ситуацию, но я просто не вижу этого.

Для работы с NSUserDefaults я могу setBool (уже делаю это), setFloat (опять уже делаю это), setInteger и setObject.

Очевидно, я мог бы объявить ключи для каждого элемента массива и хранить их один за другим с setInteger, но это действительно глупо. Какой лучший способ справиться с этим? Вместо массива unsigned char s я как-то пытаюсь использовать NSObject? Есть ли на NSObject s хорошие учебники, которые я могу прочитать, чтобы лучше понять их?

Ответы [ 5 ]

5 голосов
/ 25 июня 2009

Будут ли списки недвижимости лучше соответствовать тому, чего вы пытаетесь достичь?

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

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

2 голосов
/ 25 июня 2009

Вы можете передать NSArray или NSDictionary на NSUserDefaults с помощью setObject:forKey:. Работает просто отлично. Очевидно, что ваш массив неподписанных символов должен стать NSArray из NSNumbers, что подразумевает некоторые накладные расходы, но это, вероятно, ваш самый простой вариант.

1 голос
/ 25 июня 2009

Попробуйте использовать объект NSData, который можно напрямую сохранить в NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len]
                                          forKey:@"someArray"];
0 голосов
/ 25 июня 2009

Чтобы преобразовать 50-элементный массив C беззнаковых символов в NSArray, который можно сохранить в NSUserDefaults, используя:

NSMutableArray* a = [NSMutableArray new];
for ( int i = 0; i < 50; ++i ) {
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]];
}
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"];
[a release];

чтобы получить его обратно:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"];
for ( int i = 0; i < 50; ++i ) {
    yourArray[i] = [[a objectAtIndex:i] integerValue];
}

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

0 голосов
/ 25 июня 2009

Да, вы действительно должны использовать Core Data (или просто sqllite) для хранения состояния игры. NSUserDefaults для того, что говорит - по умолчанию, настройки конфигурации. На самом деле он не предназначен для хранения больших кусков двоичных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...