Хранение объектов в iOS для последующего использования - PullRequest
6 голосов
/ 07 августа 2011

Мое приложение извлекает данные JSON из нашего веб-сервиса. Во всех случаях вплоть до настоящего времени информация будет сохраняться в памяти или просто обновляться на лету без необходимости сохранять что-либо локально, кроме токена входа, используемого в API. С одной из новых функций, которые мы добавляем, мы будем брать группу местоположений, 26 макс., С длиной, широтой, радиусом и именем.

Мне также нужно добавить 1-2 поля к этим данным, чтобы создать более крупный объект. Итак, мой вопрос: как лучше всего хранить данные такого типа в файловой системе iOS? В настоящее время я использую NSUserDefaults, но это кажется своего рода ограниченным или не рекомендуется для больших объемов данных. Возможно нет.

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

Ответы [ 3 ]

5 голосов
/ 07 августа 2011

Для такого небольшого количества данных (26 единиц) я предлагаю архивирование .

Сохранить в plist, используя NSKeyedArchiver / NSKeyedUnarchiver.Прочитайте ваши данные из делегата didFinishLaunchingWithOptions и прослушайте UIApplicationWillResignActiveNotification, чтобы сохранить их.

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

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

Если вам нужны дополнительные функции, см. Лучший способ хранения данных на iphone , но, похоже, это не так.будь так.

Какой-то код, чтобы начать ... Зарегистрируйся, чтобы вызвать save в приложении. В отставку:

[[NSNotificationCenter defaultCenter]
        addObserver:self 
           selector:@selector(saveMyData) 
               name:UIApplicationWillResignActiveNotification 
             object:nil];

Для каждого объекта графа / словаря / того, что ты хочешьВ архиве реализовано NSCoding:

- (void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:myIvar forKey:kmyIvar];
}

- (id)initWithCoder:(NSCoder*)coder {
    if((self = [super initWithCoder:coder])) {
        self.myIvar = [[coder decodeObjectForKey:kmyIvar] retain];
    }
    return self;
}
3 голосов
/ 07 августа 2011

Ознакомьтесь с этим руководством по основным данным.Это лучший способ хранить данные локально на вашем устройстве.Это нативный API для какао, и он совместим с привязкамиКроме того, вы можете выбрать, сохранять ли данные как XML, SQLite и Binary.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

Для всего, что удаленно велико, я бы использовал это.

1 голос
/ 18 августа 2012

У меня был тот же вопрос и я нашел гораздо лучшее решение.

Что вы можете сделать, это просто сохранить строку JSON в качестве NSUserDefault. Затем, когда вы перезагружаете приложение, используйте тот же метод (или утилиту фреймворка), который вы использовали для сопоставления строки JSON с вашими объектами в первый раз. Таким образом, вы все еще можете воспользоваться простотой NSUserDefaults.

Если вы используете RestKit для управления своими веб-сервисами, это станет еще проще. Ответ на этот пост показывает, как использовать JSON-анализатор RestKit для сопоставления JSON с вашим объектом.

Десериализация локальной NSString JSON в объекты через RestKit (без загрузки по сети)

...