如何在退出时轻松地保存应用程序状态

3
假设我的应用程序状态被提取到一个对象中(这样所有与应用程序实例相关的信息都包含在一个对象中),并且该对象支持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"];
}

但是在加载时状态始终为nil...所以我认为这不是最好的模式 :)


事实证明,NSUserDefaults仅支持属性列表对象,例如NSArray、NSData等等...除非你将其包装在NSData中,否则不支持自定义对象。

2个回答

5

在应用程序退出前存储其状态并在下次启动时恢复它有许多方法。最好的方法取决于您的应用程序。

如果您具有简单的对象模型,只有一个根对象,并且倾向于一次性将整个对象模型保存在内存中,则可能会发现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

state是什么类型的对象?

我认为NSUserDefaults只能保存NSDataNSStringNSDictionaryNSDateNSArrayNSNumber

过去,我将状态保存到字典中,并使用NSUserDefaults存储它。您还可以将状态归档并转换为NSData,然后使用NSUserDefaults保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接