2015-05-22 87 views
-5

我已经看到了无数使用NSUserDefaults保存整数的例子,但没有一个显示我保存并加载它们的位置。我在哪里可以保存NSUserDefaults

我在哪里可以把代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setInteger:9001 forKey:@"HighScore"]; 
[defaults synchronize]; 

吗? 我把它放在viewDidLoad中吗?

+0

这取决于。我将尽快保存它,以防用户可能会在我的应用程序中使用并在使用之前加载它。 – KudoCC

+0

您需要提供更多关于您已经尝试过的以及您遇到的问题的详细信息。用具体的细节和代码更新您的问题,以便我们指出您的方向。 – rmaddy

+0

在你的问题中清楚。这取决于你想要做什么以及你想做什么。一般来说,保存应该在要保存的数据可用的地方进行。 –

回答

0

您可以保存您的变量并在需要的任何地方从NSUserDefaults中读取它。你可以将它保存在AppDelegate或ViewDidAppear中,无论你喜欢什么。请记住,NSUserDefault类似于本地缓存,用于保存某些变量,因此,当用户杀死您的应用或从后台重新启动应用时,您可以从中读取一些数据,并知道暂停的应用状态或停止。

但是,不要滥用它。它应该只保存一些轻量级的数据,例如上次刷新时间,用户名,访问令牌等。

+0

所以我保存int在viewDidLoad中并将其加载到viewDidAppear中? @Wingzero –

+0

你必须先知道你的逻辑。正如我所说,你可以将它保存在任何地方,并在任何地方阅读。你不这样做viewDidLoad并阅读它viewDidAppear,它没有任何意义。 NSUserDefault是一种磁盘缓存,而不是内存缓存。您的应用程序可以被解除分配,并且所有内存缓存都不存在。但是,下一次重新启动应用程序时,磁盘缓存仍然可以工作,并且您还可以获得一些数据以及 – Wingzero

1

这取决于您的应用程序的要求。可能有多种情况,

  1. 您要保存数据到NSUserDefaults反复您可能要坚持到保存数据的一小会儿时间越长,因为如果保存到NSUserDefaults反复发生,你需要决定将数据保存到NSUserDefaults的最佳时间。

例如: 你是存储用户的在线/离线状态,并以1秒的反复检查,并保存到NSUserDefaults,这是非常 昂贵的过程,甚至在性能和电池消耗方面。 因此,您可能想要保留保存部分,但是,请将您的 数据保存到- (void)applicationWillResignActive:(UIApplication *)application或其他适当的appDelegate方法中。这样,您的数据将被正确保存,而且消耗的电量也不会太多,并且也会影响性能。

  • 您节约了大量列表NSUserDefaults(你不应该)好了, 这种情况下是棘手的,所有的开发者会说,你不应该保存的数据量巨大到NSUserDefaults,使用别的东西作为数据库,而不是NSUserDefaults。但是,如果你仍然不服气,你应该使用[[NSUserDefaults standardUserDefaults] synchronize],你之后对数据的访问,或之后[[NSUserDefaults standardUserDefaults] setObject:@"OBJECT" forKey:@"KEY"]
  • 在我看来正确的,最好的地方,保存任何NSUserDefaults数据是- (void)applicationWillResignActive:(UIApplication *)application。要 了解看这个例子中,

    您保存到NSUserDefaults 5倍于你的应用程序,让我们假设 它占用了0.0001秒的执行,并采取0.0001%的电池消耗 。总计,执行 和0.0001 * 5 = 0.0005%的电池需要0.0001 * 5 = 0.0005秒。

    但是,如果您只进行一次这样的操作,则只需要0.0001-0.0002秒 秒(只是假设)即可执行并且消耗电量为0.0001%-0.0002%。

    +0

    太棒了。我会去做。虽然我在哪里加载我的'高分'int?我有viewDidLoad {self.highscoreint = [[NSUserDefaults standardUserDefaults] integerForKey:@“HighScore”]; } ??? –

    +0

    如果你想让你的highScore在类的范围内可用,你应该在viewDidLoad中做,否则你可以在需要时从'NSUserDefaults'中直接获取,从字面上来看。例如,您只需要一个名为'calculateFinalScore'的方法就可以使用highScore,因此只需在此方法中获取它,然后不需要将其声明为属性。否则,您希望在同一个类的多个位置使用highScore,创建一个属性并从'viewDidLoad'或'viewWillAppear'或'viewDidAppear'中的'NSUserDefaults'值赋值。 –

    +0

    好吧,所以这里是一切都是我的应用到目前为止,请告诉我,如果我听起来很迷惑....我有5个视图控制器类在我的应用程序,包括2失败页和4级。如果用户击败self.highScoreInt,则将其传递给下一个类(下一级)。当用户失败时,他们被带到失败页面。在failurePage.m中,viewDidLoad有{self.highScoreLabel.text = [NSString stringWithFormat:@“%i”,self.highScoreInt]; }来显示用户的高分。我在哪里放NSUserDefaults,以便当标签读取加载的'self.highScoreInt'?非常感谢你帮助 –