在我的应用程序中,我有Singleton对象,它应该通过应用程序启动来保存其状态。所以我需要以某种方式保存它。
我只看到两个选项:1)将其保存在应用终止上(加上,也许,去后台); 2)每次更改任何属性时保存。
第一个选项看起来很糟糕,因为应用程序可能会被杀死,例如,因为某些错误,内存限制或设备关机(电池电量不足)。所以我希望状态不会被保存。
第二个选项需要有关每个更改的手动通知,或者需要KVO +观察每个属性。
似乎我在这里做错了什么。也许,你可以给我一些建议或者有一些众所周知的模式(我试过谷歌,但没有发现任何特别的东西)。
更新
是的,有NSUserDefaults
,但是为了提高它的可用性(不仅仅是键值)我会编写包装方法,所以我将以相同的问题(手动编码行)结束。
UPDATE2:
CoreData
对我来说也是不错的选择:只需要一个存储+插入的对象,还需要更多的代码行。
UPDATE3:
这不是关于“如何保存”的问题。这是关于“如何自动调用此保存(或使用较少的编码)”。因此,在NSUserDefault
方式中,我们需要手动将每个属性实现为包装器。在NSCoding
- 来自每个媒体资源save
或发布通知(以便从一个地方捕获和保存)。
答案 0 :(得分:1)
我认为第一种选择是更好的方法。操作系统总是会通知应用程序何时被杀死,例如内存警告将调用didReceiveMemoryWarning方法,您可以将状态保存到单例对象。 (设备断电与前往后台相同,因此将调用applicationWillEnterForeground方法。)
答案 1 :(得分: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。