2013-08-13 13 views
2

В моем приложении у меня есть объект Singleton, который должен сохранять его состояние через запуск приложений. Поэтому мне нужно как-то сэкономить.iOS Autosaved object

Я вижу только два варианта: 1) сохранить его при завершении работы приложения (плюс, возможно, переход на задний план); 2) сохранять его каждый раз, когда какое-либо свойство изменено.

Первый вариант выглядит плохо, потому что приложение может быть убито, например, из-за ошибки, ограничений памяти или отключения питания устройства (разряженная батарея). Поэтому я ожидаю, что состояние не будет сохранено.

Второй вариант требует либо ручных уведомлений о каждом изменении, либо KVO + наблюдение за каждым свойством.

Кажется, что я делаю что-то неправильно здесь. Может быть, вы можете дать мне совет или есть какой-то известный шаблон (я пытался Google, но ничего не нашел).

UPDATE:

Да, есть NSUserDefaults, но и улучшить его юзабилити (. Л больше, чем просто ключ-значение), я хотел бы написать обертку-Methords, поэтому я закончу с той же проблемой (строки ручного кодирования).

UPDATE2:

CoreData также плохой выбор для меня: только один объект для хранения + вставив туда также необходимо еще несколько строк кода.

Update3:

Это не вопрос о том, "как сохранить". Речь идет о том, как «автоматически вызывать это сохранение (или с меньшим количеством кодирования)». Поэтому в способе NSUserDefault нам нужно вручную реализовать каждое свойство в качестве обертки. В NSCoding - звоните save или отправьте уведомление (чтобы поймать & сохранить с одного места) от каждого имущества также.

+0

Вы можете использовать [NSUserDefaults] (http://www.icodeblog.com/2008/10/03/iphone-programming-tutorial-savingretrieving-data-using-nsuserdefaults/), он синхронизируется автоматически (или вручную, если вы предпочитают) – Daniel

+0

Вы также можете реализовать протокол NSCoding для сохранения всего класса: см. [этот вопрос] (http://stackoverflow.com/questions/3000220/best-way-to-save-to-nsuserdefaults-for-custom- класс) – Daniel

+0

simpleBob, вопрос не в том, как сохранить, но как сделать эти изменения достаточно частыми (в идеале - автоматическими) для хранения актуального объекта. – kpower

ответ

1

Самый простой способ сохранить пользовательские состояния в iOS - NSUserDefaults.

Вот пример, который отслеживает все изменилось на Ваш одноточечный:

@interface MySingleton : NSObject 
{ 
} 

+ (MySingleton *)sharedSingleton; 

@property (copy) NSString *userName;//the variable to track 
@end 

@implementation MySingleton 
@synthesize userName; 
+ (MySingleton *)sharedSingleton 
{ 
    static MySingleton *sharedSingleton; 

    @synchronized(self) 
    { 
    if (!sharedSingleton) 
     sharedSingleton = [[MySingleton alloc] init]; 

    return sharedSingleton; 
    }  
} 

- (void)setUserName:(NSString*)userName 
{ 
    //update the variable 
    self.userName = userName; 
    //saves the new value to NSUserDefaults 
    [[NSUserDefaults standardUserDefaults] setObject:userName forKey:@"userName"]; 
    //forces instantaneous synchronization, not needed, would be updated after a periodic interval anyways 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
@end 

При желании вы можете реализовать протокол NSCoding и сохранить весь класс NSUserDefaults, посмотри на this question.

+0

Спасибо, но здесь вы все еще реализуете все свойства вручную - надеетесь на лучшее решение :) – kpower

+0

@kpower вы также можете сохранить все за один раз, если вы реализуете NSCoding в первую очередь – Daniel

+0

Я знаю! Я хочу, чтобы это 'save' вызывалось как-то автоматически! – kpower

1

Я думаю, что первый вариант - лучший способ сделать это. OS всегда информирует приложение, когда оно будет убито, например, для предупреждений о памяти, будет вызван метод didReceiveMemoryWarning, в котором вы можете сохранить состояния для объекта singleton. (Отключение питания устройства аналогично переходу на задний план, поэтому будет вызван метод applicationWillEnterForeground).

+1

«Даже если вы разрабатываете приложение с помощью iOS SDK 4 и более поздних версий, вы все равно должны быть готовы к тому, что ваше приложение будет убито без какого-либо уведомления». («Закрытие приложения» здесь: http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW49) – kpower

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

  • Нет связанных вопросов^_^