2

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

我只看到两个选项:1)将其保存在应用程序终止(加上,也许,去后台);2)每次更改任何属性时都保存它。

第一个选项看起来很糟糕,因为应用程序可能会被杀死,例如,由于某些错误、内存限制或设备断电(电池电量不足)。所以我希望状态不会被保存。

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

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

更新:

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

更新2:

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

更新3:

这不是关于“如何保存”的问题。这是关于“如何自动调用此保存(或使用更少的编码)”。因此,NSUserDefault我们需要手动将每个属性实现为包装器。还从每个属性NSCoding调用save或发布通知(从一个地方捕捉和保存)。

4

2 回答 2

1

我认为第一种选择是更好的方法。操作系统总是通知应用程序何时将被杀死,例如内存警告,将调用 didReceiveMemoryWarning 方法,您可以在其中将状态保存到单例对象。(设备断电与进入后台相同,因此将调用 applicationWillEnterForeground 方法)。

于 2013-08-13T11:42:17.640 回答
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,看看这个问题

于 2013-08-13T11:52:28.570 回答