數據持久性( Data Persistence ) 是將任何類型的數據存儲到本地端的機制,在本地存儲數據的能力,以便使用者下次打開應用程序時可以使用相同的數據而不會更改,接下來將介紹幾種最常見的數據存儲方式。參考文件
讓我們從數據存儲中最簡單的 UserDefaults 開始, UserDefaults 用作鍵值存儲, 有特定的方法來檢索精確的數據類型(bool(forKey:)、int(forKey:)
等)和 object(forKey)
來檢索 Any
UserDefaults 是一個 NSObject 子類,它為我們提供了同步讀取和寫入(在緩存級別)和異步持久化級別。
class UserRepository {
enum Key: String, CaseIterable {
case name, avatarData
func make(for userID: String) -> String {
return self.rawValue + "_" + userID
}
}
let userDefaults: UserDefaults
// MARK: - Lifecycle
init(userDefaults: UserDefaults = .standard) {
self.userDefaults = userDefaults
}
// MARK: - API
func storeInfo(forUserID userID: String, name: String, avatarData: Data) {
saveValue(forKey: .name, value: name, userID: userID)
saveValue(forKey: .avatarData, value: avatarData, userID: userID)
}
func getUserInfo(forUserID userID: String) -> (name: String?, avatarData: Data?) {
let name: String? = readValue(forKey: .name, userID: userID)
let avatarData: Data? = readValue(forKey: .avatarData, userID: userID)
return (name, avatarData)
}
func removeUserInfo(forUserID userID: String) {
Key
.allCases
.map { $0.make(for: userID) }
.forEach { key in
userDefaults.removeObject(forKey: key)
}
}
// MARK: - Private
private func saveValue(forKey key: Key, value: Any, userID: String) {
userDefaults.set(value, forKey: key.make(for: userID))
}
private func readValue<T>(forKey key: Key, userID: String) -> T? {
return userDefaults.value(forKey: key.make(for: userID)) as? T
}
}
建議使用 UserDefaults 來存儲用戶的偏好。 我們應該用它來存儲較零碎的訊息(例如,用戶是喜歡亮模式還是暗模式,他們想在什麼時間收到每日提醒,他們是否真的想收到通知等)