讨论:
“此类应用的最佳做法是什么?为什么?”是一个很好的问题。如果您描述您正在开发的应用程序类型会有所帮助。
既然您似乎只在应用程序运行时需要/想要数据,那么我想最好的方法是将其保存在您已经在做的一些单例或静态变量的内存中。
但是,如果您不不想在应用重新启动后存储您的数据,那么您可能希望您的数据在一段时间后过期,因为应用可能会打开很长时间。 p>
那么问题是您希望如何在运行时接收数据。假设您已经缓存了数据,并且您仍然希望刷新数据。然后你可以设计你的数据管理,这样你获取项目的关闭可能会被调用多次。假设有这样的事情:
func fetchUsers(callback: ((_ users: [Any]?, _ isFromCache: Bool) -> Void)) {
if let cachedUsers = MyCache.fetch(.users) {
callback(cachedUsers, true)
}
APIManager.fetch(.users, { users, error in
if let users = users {
MyCache.insert(.users, items: users)
}
callback(users, false)
})
}
假设您想在某个表格视图中显示这些用户,您可以执行以下操作:
func refreshData() {
self.startActivityIndicator() // Start some minor activity indicator
fetchUsers { (users, isFromCache) in
self.users = users // Assign users whatever they are
if users == nil {
// Show error here
}
if isFromCache == false {
self.stopActivityIndicator() // Only stop activity when fresh data were received so user know he may expect the UI to change
}
tableView.reloadData()
}
}
这将设计数据获取的用户界面部分,但与数据的存储位置和方式无关。例如MyCache 应该仍然选择缓存响应仍然有效或过时的天气。 MyCache 决定将数据存储到某个数据库中还是仅存储在内存中。
一些存储过程:
为了保持之前的 sn-ps 中的设计,您可能有一个静态类 MyCache,它具有存储类型的字符串枚举。然后它有一个静态字典[String: Any],其中包含缓存数据,因此 fetch 方法看起来像
func fetch(type: FetchType) {
return cacheDictionary[type]
}
那么插入非常相似。
要添加日期(或其中的任何其他数据),您可以将其定义为 [String: [String: Any]] 并使用静态键,因此您的数据将是 cacheDictionary[type]["date"] as? Date 和数据为 cacheDictionary[type]["data"]。
然后您可以扩展您的缓存以使用用户默认值,例如:
func fetch(type: FetchType) {
if let inMemory = cacheDictionary[type] {
return inMemory
} else if let inDefaults = UserDefaults.standard.object(forKey: type) {
cacheDictionary[type] = inDefaults // Keep it in memory for net time
return inDefaults
} else {
return nil
}
}
这是用于存储直接 JSON 数据或对象。同样可以应用于将数据存储(使用JSONSerializer 对其进行序列化)到文件中。您可以在临时目录或库中创建一个基本路径,然后使用type 的文件名。系统可能会清除您可能想要的临时目录,并且库目录将保持不变。
然后是数据库:
数据库是另一回事。将数据库应用到与上述相同的过程中是没有意义的,因为这太过分了,而且您根本没有使用数据库的任何好处。
对于数据库,您将为每个响应创建模型并将数据插入数据库,然后通知您的 UI 控制器进行更新。这意味着回调不是最佳实践,而是委托。例如,您将拥有DatabaseManager 并且在视图中确实出现了您会调用DatabaseManager.shared.delegate = self 然后Users.fetchNewUsers() 并等待委托触发。然后在委托上,您将从数据库中获取对象或创建获取结果控制器...
可能还有很多其他方法,但我希望这能让您了解如何存储数据,何时使用。