【问题标题】:iOS Autosaved objectiOS 自动保存的对象
【发布时间】:2013-08-14 23:49:48
【问题描述】:

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

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

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

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

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

更新:

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

更新 2:

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

更新3:

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

【问题讨论】:

  • 您可以使用NSUserDefaults,它会自动同步(如果您愿意,也可以手动同步)
  • 也可以实现NSCoding协议来保存整个类:见this question
  • simpleBob,问题不是如何保存,而是如何使这些更改足够频繁(理想情况下是自动)以将对象存储为最新的。
  • 这正是 NSUserDefaults 所做的,请参阅下面的答案
  • 实际上,你不应该使用同步。来自苹果:Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.

标签: ios state-saving change-notification


【解决方案1】:

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

【讨论】:

【解决方案2】:

在 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

【讨论】:

  • 谢谢,但在这里您仍然手动实现所有属性 - 希望有更好的解决方案:)
  • @kpower 如果您先实施 NSCoding,您也可以一次性保存所有内容
  • 我知道!我希望以某种方式自动调用此 save
  • 我认为您只有 3 个选项,其中只有第一个是个好主意:(1)您以某种方式跟踪变量何时发生变化 f.e.通过属性。 (2) 您实施定期储蓄 f.e.使用 NSTimer。 (3) 您尝试在关闭之前保存数据。
  • (3) 应该与 (1) 或 (2) 互补
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2013-10-22
  • 2012-10-03
相关资源
最近更新 更多