通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是啥?
Posted
技术标签:
【中文标题】通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是啥?【英文标题】:What is correct way to store/retrieve user data (read/write files) in iPhone (iOS) dev via Swift?通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是什么? 【发布时间】:2020-05-04 14:38:06 【问题描述】:背景
我已经通过 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 系统中应该存储在哪里?
您可以将文件保存在某种用户偏好或应用数据中吗
地点?
如何打开文件进行读/写和读/写数据? (斯威夫特)
如何更好地理解可用于读写的路径
文件?
我已经到处寻找这个答案。你能指出我的官方文档、一本书、一个 *** 项目或能清楚解释这一点的东西吗? (希望有 Swift 的例子。)
【问题讨论】:
【参考方案1】:参见ios Storage Best Practices 视频和File System Basics 文档。这应该会让你继续前进。
简而言之,应用程序数据通常存储在“应用程序支持目录”中,暴露给用户的文档(例如 Files 应用程序)存储在“文档”文件夹中,可以轻松重新检索的下载存储在“缓存”中“ 文件夹。从技术上讲,您可以使用 UserDefaults
来存储此类应用程序数据,但它确实不是为此目的。
重新打开文件进行“读/写”,在处理 JSON 时,您通常不会这样做。您将文件读入 Data
并将 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)
当您想要更新时,将模型对象序列化为包含您的 JSON 的 Data
,然后将其写入文件,替换文件。
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 的序列化。请参阅Encoding and Decoding Custom Types 了解更多信息。
【讨论】:
感谢您提供如此有用的摘要。现在我有了一些术语 (.applicationSupportDirectory) 和我链接的那些视频,我有了一个起点。而且,是的,我已经制定了我的 Codable 模型对象,只是需要一种方法来写出它并每次反序列化它。再次感谢。我会查看所有内容,稍后再回来标记为答案。 试用了您提供的示例代码,它非常适合我的情况。我非常感谢您提供代码以及其他帮助。将此标记为答案。以上是关于通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中获取 iPhone 位置,无需将“位置服务”设置为“开”
CoreData 适用于我的模拟器,但不适用于使用 xCode 6 的 iOS 8 Swift 中的 iPhone
在 UILabel 中显示 HTML 文本,性能问题。 [iPhone SDK、iOS 8、Swift]
swift [英寸尺寸]获得iPhone尺寸的英寸#tags:swift,ios