iOS自动保存对象

时间:2013-08-13 11:24:20

标签: ios state-saving change-notification

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

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

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

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

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

更新

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

UPDATE2:

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

UPDATE3:

这不是关于“如何保存”的问题。这是关于“如何自动调用此保存(或使用较少的编码)”。因此,在NSUserDefault方式中,我们需要手动将每个属性实现为包装器。在NSCoding - 来自每个媒体资源save或发布通知(以便从一个地方捕获和保存)。

2 个答案:

答案 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