使用 UserDefaults 的最佳方法
Best approach to use UserDefaults
我刚开始学习 swift,决定制作第一个待办事项应用程序,但我有一个问题。有必要在任何用户操作期间保存所有数据:创建、更改或删除任务。每次都调用一个方法来保存数据是一种不好的做法。你能推荐什么?
func addItem(itemName: String, isCompleted: Bool = false) {
tasks.append(Tasks(taskName: itemName, isCompleted: isCompleted))
saveData()
}
我将任务存储在一个结构中。在使用该结构之前,我使用了这样的计算 属性:
var ToDoItems: [[String: Any]] {
set {
UserDefaults.standard.set(newValue, forKey: "ToDoDataKey")
UserDefaults.standard.synchronize()
}
get {
if let userData = UserDefaults.standard.array(forKey: "ToDoDataKey") as?
[[String: Any]] {
return userData
} else {
return []
}
}
}
在didSet
of tasks
array
中,可以简单的设置当前数组元素在UserDefaults
.
struct Task: Codable {
let taskName: String
let isCompleted: Bool
}
var tasks = [Task]() {
didSet {
let data = try? JSONEncoder().encode(tasks)
UserDefaults.standard.set(data, forKey: "ToDoDataKey")
}
}
func addItem(itemName: String, isCompleted: Bool = false) {
tasks.append(Task(taskName: itemName, isCompleted: isCompleted))
}
这将确保UserDefaults
中的数据与当前内存中的数据同步。
并且只在 viewDidLoad()
第一次加载数据的地方获取数据。
func fetchTasks() -> [Task] {
if let data = UserDefaults.standard.data(forKey: "ToDoDataKey"), let tasks = try? JSONDecoder().decode([Task].self, from: data) {
return tasks
}
return []
}
在 viewDidLoad()
中调用 fetchTasks()
。
不需要每次任务数组变化都去打盘。通常的做法是注册 UIApplication notification,告诉您您的应用程序即将停用,然后保存为默认值。
您只需要在 viewDidLoad
从默认值中检索,正如您已经被告知的那样。
(在 iOS 13 中有多个 window 支持,事情有点复杂;参见 。)
我刚开始学习 swift,决定制作第一个待办事项应用程序,但我有一个问题。有必要在任何用户操作期间保存所有数据:创建、更改或删除任务。每次都调用一个方法来保存数据是一种不好的做法。你能推荐什么?
func addItem(itemName: String, isCompleted: Bool = false) {
tasks.append(Tasks(taskName: itemName, isCompleted: isCompleted))
saveData()
}
我将任务存储在一个结构中。在使用该结构之前,我使用了这样的计算 属性:
var ToDoItems: [[String: Any]] {
set {
UserDefaults.standard.set(newValue, forKey: "ToDoDataKey")
UserDefaults.standard.synchronize()
}
get {
if let userData = UserDefaults.standard.array(forKey: "ToDoDataKey") as?
[[String: Any]] {
return userData
} else {
return []
}
}
}
在didSet
of tasks
array
中,可以简单的设置当前数组元素在UserDefaults
.
struct Task: Codable {
let taskName: String
let isCompleted: Bool
}
var tasks = [Task]() {
didSet {
let data = try? JSONEncoder().encode(tasks)
UserDefaults.standard.set(data, forKey: "ToDoDataKey")
}
}
func addItem(itemName: String, isCompleted: Bool = false) {
tasks.append(Task(taskName: itemName, isCompleted: isCompleted))
}
这将确保UserDefaults
中的数据与当前内存中的数据同步。
并且只在 viewDidLoad()
第一次加载数据的地方获取数据。
func fetchTasks() -> [Task] {
if let data = UserDefaults.standard.data(forKey: "ToDoDataKey"), let tasks = try? JSONDecoder().decode([Task].self, from: data) {
return tasks
}
return []
}
在 viewDidLoad()
中调用 fetchTasks()
。
不需要每次任务数组变化都去打盘。通常的做法是注册 UIApplication notification,告诉您您的应用程序即将停用,然后保存为默认值。
您只需要在 viewDidLoad
从默认值中检索,正如您已经被告知的那样。
(在 iOS 13 中有多个 window 支持,事情有点复杂;参见