如何在应用程序关闭时保存NSUserDefaults。

4

我在游戏中使用了一个类似NSUserDefaults的分数结构,希望能在应用程序终止时保存这些值。是否有一些方法可以在重新打开应用程序时从文件中加载并保存?


2
你需要理解两个概念才能使其正常工作:iOS 应用的生命周期以及在该生命周期内调用哪些应用程序委托方法。如何保存/加载 NSUserDefaults 值。这两个概念都有详细文档可以参考,建议在发布之前先进行搜索。 - Droppy
3个回答

3
不要。在每次更改后保存它们(或者,如果您知道您会在短时间内有很多更改,请在更新后批量保存它们)。
在当前版本的iOS中,基本上不会调用applicationWillTerminate:(因为背景功能被引入),因此您不应该依赖它。此外,请考虑如果您的应用程序崩溃且没有保存任何用户信息会发生什么-这不是一个好的用户体验。
所以,永远不要依赖applicationWillTerminate:来做任何事情...

0
在iOS 10.3.2中,即使我们调用了同步方法,数据也不会被持久化到磁盘上。这只有在我们试图在"applicationWillTerminate"中设置值并同步数据时才会出现问题。这可能是一个bug。
因此,如果想要在应用程序终止时保存一些信息,可以将其写入plist文件并存储在文档目录中。我已经测试过它可以工作。
Swift 3.0.2:
func applicationWillTerminate(_ application: UIApplication) {

    let plistPath = getPath()

    if !FileManager.default.fileExists(atPath: plistPath) {

        FileManager.default.createFile(atPath: plistPath, contents: nil, attributes: nil)

    }

    let data:NSMutableDictionary = [:]
    data.setValue("test_Value", forKey: "test_key")
    data.write(toFile: plistPath, atomically: true)
}


func getPath() -> String {
    let plistFileName = "data.plist"
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentPath = paths[0] as NSString
    let plistPath = documentPath.appendingPathComponent(plistFileName)
    return plistPath
}

func displaySavedData() {
    let plistPath = self.getPath()
    if FileManager.default.fileExists(atPath: plistPath) {
        if let savedData = NSMutableDictionary(contentsOfFile: plistPath) {
            print(savedData)
        }
    }
}

应用程序启动时,可以按以下方式访问值:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    displaySavedData()
    return true

}

如其他答案所述,“applicationWillTerminate”在应用程序支持后台模式的情况下不会被调用,因此当您的应用程序不支持后台模式并且您知道杀死应用程序将调用“applicationWillTerminate”时,此解决方案非常有用。


0
applicationWillTerminate中设置NSUserDefaults值后,确保您调用[[NSUserDefaults standardDefaults] synchronize],以便立即将更改刷新到磁盘并在应用程序启动之间持久化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接