Как легко сохранить состояние приложения при выходе - PullRequest
3 голосов
/ 18 сентября 2010

Скажем, мое состояние приложения извлекается в объект (так что вся информация, относящаяся к экземпляру приложения, содержится в одном объекте) и этот объект поддерживает протокол nscoding. Как я могу легко сохранить его и загрузить при выходе / запуске моего приложения?

Мой текущий код выглядит так

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    State* state = (State*)[defaults objectForKey:@"State"];
    if(state!=nil)
    {
    viewController.state = state;
    }
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:self.viewController.state forKey:@"State"];
}

Но при загрузке состояние всегда равно нулю ... поэтому я предполагаю, что это не лучший шаблон там:)


Оказывается, что NSUserDefaults поддерживает только объекты списка свойств, такие как NSArray, NSData и т. Д. ... нет пользовательских объектов, если вы не заключите его в nsdata

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Существует несколько способов сохранить состояние вашего приложения до его закрытия и восстановить его при повторном запуске.Лучший подход действительно зависит от вашего приложения.

Если у вас есть простая объектная модель с одним корневым объектом, и вам, как правило, нужна вся объектная модель в памяти сразу, тогда вы можете найти протокол NSCoding (см.ссылка ниже) хороший способ сохранения состояния.

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

Любой из объектов, которые вы хотите сохранить, должен реализовать два метода этого протокола:

 - (void)encodeWithCoder:(NSCoder *)aCoder // to serialise the object
 - (id)initWithCoder:(NSCoder *)aCoder // to restore an object

После того, как вы реализовали эти методы в любом изобъекты, которые вы хотите сохранить, вы можете сериализовать свой граф объектов следующим образом:

- (void)applicationWillTerminate:(UIApplication *)application {
  [NSKeyedArchiver archiveRootObject:yourRootObject toFile:someFilePath];
}

Когда вы хотите восстановить заархивированные объекты:

- (BOOL)application:(UIApplication *)application
     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  id yourRootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:someFilePath];
}

В качестве альтернативы, если объект вашего приложениямодель немного сложнее, вы могли бы рассмотреть использование Core Data.

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

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

0 голосов
/ 19 сентября 2010

Какой тип объекта является состоянием?

Я считаю, что NSUserDefaults спасет только NSData, NSString, NSDictionary, NSDate, NSArray и NSNumber.

Раньше я сохранял состояние в словаре и сохранял его, используя NSUserDefaults. Вы также можете заархивировать свое состояние и преобразовать его в NSData и сохранить его с помощью NSUserDefaults.

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