Сохранение данных с помощью NSUserDefaults

Это классическая проблема iOS - где мне сохранять данные? Я написал несколько приложений для iOS и использовал основные данные, а также файлы plist. Кроме того, я обычно использую NSUserDefaults для сохранения пользовательских настроек, которые, по сути, представляют собой один небольшой словарь с ключами и значениями. По моему (возможно, неверному) мнению, NSUserDefaults - это самый простой способ хранения информации, которая требуется в глобальном масштабе в приложении.

У меня есть реляционные данные, которые загружаются с сервера как объект JSON, и мне было интересно, как далеко я могу продвинуть NSUserDefaults. Размер моих данных может достигать нескольких мегабайт. Я знаю, что NSUserDefaults справится с этим, как я пытался, однако есть ли какие-либо риски, связанные с сохранением данных таким образом, несмотря на то, что это не обязательно для хранения больших больших объемов данных? Будет ли мое приложение отклонено? Могут ли потенциально быть проблемы с памятью и производительностью?


person Rambatino    schedule 02.11.2013    source источник
comment
См. stackoverflow.com/questions/5520797/   -  person Paul Cezanne    schedule 02.11.2013
comment
и stackoverflow.com/questions/6173625/ особенно ответ, в котором упоминается основной поток.   -  person Paul Cezanne    schedule 02.11.2013
comment
Я не могу добавить дополнительную информацию к ответу @PaulCezanne, но, AFAIK, ваше приложение не будет отклонено, если вы перейдете с NSUserDefaults для хранения больших данных.   -  person amb    schedule 02.11.2013


Ответы (1)


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

    NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    path = [path stringByAppendingPathComponent:@"Private Documents"];
    path = [path stringByAppendingPathComponent:@"YourAppName"];
    [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];

    NSString *filePath = [self.basePath stringByAppendingPathComponent:@"filename.json"];

    // Now save or load the data using NSData or an NSInputStream
    NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:resource];
    [inputStream open];

    id object = [NSJSONSerialization JSONObjectWithStream:inputStream options:0 error:nil];

    // you can write JSON objects in a similar way
person gimenete    schedule 02.11.2013