首页 > 解决方案 > 通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是什么?

问题描述

背景

我已经通过 Windows Forms (C#)、Android(Java 和 Kotlin)、HTML5 Web App、ElectronJS(在 Linux、Mac 和 Win10 上运行)甚至作为 UWP(通用 Windows 平台)应用程序编写了一个特定的应用程序。

全部使用 JSON 文件存储数据

所有这些应用程序都使用完全相同的 JSON 格式数据进行用户设置。这意味着我可以通过相同的文件和文件格式在所有平台上共享数据。在 Android 上,将文件保存在 UserPrefs 中还有一个额外的好处(它为用户提供安全和备份)。

问题 我还将应用程序编写为 iPhone/iPad 应用程序 (Swift),但是我找不到处理 JSON 文件存储的正确方法。
该问题与将 JSON 反序列化为我的业务对象无关这一切都很好。但是,我不确定:

  1. iPhone/iPad系统中的文件应该存储在哪里?
  2. 您可以将文件保存在某种用户偏好或应用数据位置吗?
  3. 如何打开文件进行读/写和读/写数据?(迅速)
  4. 如何更好地理解可用于读取和写入文件的路径?

我到处寻找这个答案。你能指出我的官方文档、一本书、一个 StackOverflow 项目或能清楚解释这一点的东西吗?(希望有 Swift 的例子。)

标签: iosswiftiphone

解决方案


请参阅iOS 存储最佳实践视频和文件系统基础文档。那应该让你继续前进。

简而言之,应用程序数据通常存储在“应用程序支持目录”中,向用户公开的文档(例如 Files 应用程序)存储在“文档”文件夹中,可以轻松重新检索的下载内容存储在“缓存”文件夹中。从技术上讲,您可以UserDefaults用于存储此类应用程序数据,但它实际上并非用于此目的。

重新打开文件以进行“读/写”,在处理 JSON 时,您通常不会这样做。您将文件读入 aData并将 JSON 反序列化为您的模型对象。

do {
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try Data(contentsOf: fileURL)
    let appData = try JSONDecoder().decode(AppData.self, from: data)
    // do something with appData
} catch { 
    print(error)
}

当您想要更新时,您将模型对象序列化为Data包含您的 JSON,然后将其写入文件,替换文件。

do {
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try JSONEncoder().encode(appData)
    try data.write(to: fileURL)
} catch { 
    print(error)
}

显然,这假设AppData类型(或任何你称之为的类型)符合Codable,但你说你熟悉 JSON 的序列化。有关详细信息,请参阅编码和解码自定义类型


推荐阅读