Day25 Data Storage in iOS 01 - UserDefaults

Data Storage in iOS

数据持久性( Data Persistence ) 是将任何类型的数据存储到本地端的机制,在本地存储数据的能力,以便使用者下次打开应用程序时可以使用相同的数据而不会更改,接下来将介绍几种最常见的数据存储方式。参考文件

UserDefaults

让我们从数据存储中最简单的 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 来存储用户的偏好。 我们应该用它来存储较零碎的讯息(例如,用户是喜欢亮模式还是暗模式,他们想在什麽时间收到每日提醒,他们是否真的想收到通知等)


<<:  Day25 Plugin 从零开始到上架 - Android instagram APIs

>>:  Day-27 请问 git rebase 和 git merge 是什麽?差别又在哪里?

Processing - Day 28 数学好棒棒 第三篇章

前言 今天接续昨天的,继续讲数学。 正文 abs() 取绝对值用的 abs(n); // n为任意数...

[DAY 18] 阿豪牛车庒冰糖猪脚

阿豪牛车庒冰糖猪脚 地点:台南市新营区公园路一段218号 时间:17:00~21:00 在南部有些店...

Day09 Kibana - Query DSL 复合查询

这一个章节节我们要来介绍复合查询,当单一的查询子句无法完成需求时,为了应付这种高级查询需求,所以就产...

D9 第四周 网路基础

当周进度 NET101 从拉面店的贩卖机理解什麽是 API 从传纸条轻松学习基本网路概念 Reque...