使用 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 支持,事情有点复杂;参见 。)