如何在applicationWillTerminate上保存NSUserDefaults

时间:2014-07-30 14:18:06

标签: ios nsuserdefaults

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

3 个答案:

答案 0 :(得分:3)

别。每次更改后保存它们(或者,如果您知道在短时间内会有很多更改,请在更新后批量保存)。

applicationWillTerminate:基本上从未在当前版本的iOS中调用(因为引入了后台),因此您不应该依赖它。另外,考虑如果您的应用程序崩溃并且没有保存任何用户信息会发生什么 - 这不是一个良好的用户体验。

所以,不要依赖applicationWillTerminate:,任何事情......

答案 1 :(得分:0)

NSUserDefaults中设置applicationWillTerminate值后,请确保调用[[NSUserDefaults standardDefaults] synchronize],以便更改立即刷新到磁盘并在应用启动之间保留。

答案 2 :(得分:0)

在iOS 10.3.2中,即使我们调用synchronize,数据也不会持久存储到磁盘。仅当我们尝试在“applicationWillTerminate”中设置值和同步数据时,这才是问题。这可能是一个错误。

因此,如果要在应用程序终止时保存一些信息,可以将其写入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”时,此解决方案非常有用。 / p>