iOS自动保存的对象



在我的应用程序中,我有Singleton对象,它应该通过应用程序启动来保存其状态。所以我需要以某种方式保存它。

我只看到两个选项:1)在应用程序终止时保存它(另外,可能是后台);2) 每次更改任何属性时都保存它。

第一个选项看起来很糟糕,因为应用程序可能会被杀死,例如,因为一些错误、内存限制或设备关机(电池电量不足)。所以我预计这个州不会被拯救。

第二个选项需要手动通知每个更改,或者KVO+观察每个属性。

我好像做错了什么。也许,你可以给我一些建议,或者有一些众所周知的模式(我试过谷歌,但没有发现什么特别的)。

更新:

是的,有NSUserDefaults,但为了提高它的可用性(smth.不仅仅是键值),我会编写包装器方法,所以我将以同样的问题(手动编码行)结束。

更新2:

CoreData对我来说也是一个糟糕的选择:只存储一个对象+在那里插入还需要更多的代码行。

更新3:

这不是一个关于"如何储蓄"的问题。这是关于"如何自动调用此保存(或使用较少的编码)"。因此,在NSUserDefault方式中,我们需要手动将每个属性实现为包装器。在NSCoding中,也可以从每个属性调用save或发布通知(从一个位置捕获并保存)。

在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,看看这个问题。

我认为第一个选项是更好的方法。操作系统总是通知应用程序何时会被杀死——例如,对于内存警告,会调用didReceiveMemoryWarning方法,在那里你可以将状态保存到singleton对象。(设备电源关闭与转到后台相同,因此将调用应用程序WillEnterForeground方法)。

最新更新