ios - 通过 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 反序列化为我的业务对象无关。这一切都很好。但是,我不确定:
- iPhone/iPad系统中的文件应该存储在哪里?
- 您可以将文件保存在某种用户偏好或应用数据位置吗?
- 如何打开文件进行读/写和读/写数据?(迅速)
- 如何更好地理解可用于读取和写入文件的路径?
我到处寻找这个答案。你能指出我的官方文档、一本书、一个 StackOverflow 项目或能清楚解释这一点的东西吗?(希望有 Swift 的例子。)
解决方案
请参阅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 的序列化。有关详细信息,请参阅编码和解码自定义类型。
推荐阅读
- javascript - 每一侧的碰撞检测不起作用
- android - 购买高级版后如何防止对程序进行永久检查?
- python - 为什么保存在 python 中的 GIF 像素值会发生变化?
- publish-subscribe - 我怎样才能收到来自 google pubsub 的推送消息
- php - 如何将 id 添加到 $_SERVER["PHP_SELF"] 提交
- c++ - vcpkg + cmake + Visual Studio 不工作
- linux - 通用 ELF 中的重定位 (EM: 183)
- angular - 带有 Angular 的 Webpack 别名 - 不能使用命名空间“UtilsService”作为类型
- java - 滚动条没有与 JTextArea 一起出现
- azure - 从 Azure 应用程序网关到 Azure Web App(应用程序服务)后端池的流量是否通过 Azure 主干网络?