如何在退出时轻松保持应用程序状态
问题描述:
假设我的应用程序状态被解压缩到一个对象中(以便所有特定于应用程序实例的信息都包含在一个对象中)并且该对象支持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中
答
在应用程序退出之前存储应用程序状态的方法有很多种,当它再次启动时会将其恢复。最好的方法真的取决于你的应用程序。
如果你有一个简单的对象模型,只有一个根对象,并且你倾向于一次需要在内存中的整个对象模型,那么你可能会发现NSCoding协议(见下面的链接)保存状态的好方法。
任何你想坚持要实现此协议的两种方法的对象:
- (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。
最后,而用户默认系统可以用于存储和检索的值,它最好用于简单的应用程序的设置(或首选项)。它并非真正用于保存整个应用程序的状态。
答
什么类型的对象是状态?
我相信NSUserDefaults
只保存NSData
,NSString
,NSDictionary
,NSDate
,NSArray
和NSNumber
。
在过去,我已经将状态保存为字典并使用NSUserDefaults
进行存储。您也可以将您的状态归档并将其转换为NSData
并将其保存为NSUserDefaults
。