| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- //
- // LNUserDefaults.swift
- // Lanu
- //
- // Created by OneeChan on 2025/11/6.
- //
- import Foundation
- var LNUserDefaults: LNUserDefaultsManager {
- LNUserDefaultsManager.shared
- }
- class LNUserDefaultsManager {
- static let shared = LNUserDefaultsManager()
- private init() {}
-
- // 内存缓存容器
- private var cache: [String: Any] = [:]
- private let lock = NSLock()
-
- private let userDefaults: UserDefaults = {
- return .standard
- }()
-
-
- subscript<T: Codable>(_ key: LNUserDefaultsKey, _ defaultValue: T) -> T {
- value(forKey: key) ?? defaultValue
- }
-
- subscript<T: Codable>(_ key: LNUserDefaultsKey) -> T? {
- get {
- value(forKey: key) ?? nil
- }
- set {
- save(newValue, forKey: key)
- }
- }
-
- /// 存储数据(自动编码)
- private func save<T: Codable>(_ value: T, forKey key: LNUserDefaultsKey) {
- do {
- let data = try JSONEncoder().encode(value)
- userDefaults.set(data, forKey: key.rawValue)
- // 更新缓存
- lock.lock()
- cache[key.rawValue] = value
- lock.unlock()
- } catch {
- Log.e("存储失败(key: \(key)):\(error)")
- }
- }
-
- /// 读取数据(自动推断类型,无需显式传递 Type.self)
- private func value<T: Codable>(forKey key: LNUserDefaultsKey) -> T? {
- // 优先从缓存读取
- lock.lock()
- defer {
- lock.unlock()
- }
-
- if let cached = cache[key.rawValue] as? T {
- return cached
- }
-
- // 从 UserDefaults 读取并解码
- guard let data = userDefaults.data(forKey: key.rawValue) else {
- cache.removeValue(forKey: key.rawValue) // 清除无效缓存
- return nil
- }
-
- do {
- let decoded = try JSONDecoder().decode(T.self, from: data)
- // 缓存解码后的数据
- cache[key.rawValue] = decoded
- return decoded
- } catch {
- Log.e("读取失败(key: \(key.rawValue)):\(error)")
-
- cache.removeValue(forKey: key.rawValue)
- return nil
- }
- }
-
- // 辅助方法:删除数据
- func remove(forKey key: LNUserDefaultsKey) {
- userDefaults.removeObject(forKey: key.rawValue)
- lock.lock()
- cache.removeValue(forKey: key.rawValue)
- lock.unlock()
- }
-
- // 辅助方法:清除所有数据(包括缓存)
- func clearAll() {
- userDefaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
- lock.lock()
- cache.removeAll()
- lock.unlock()
- }
-
- // 辅助方法:仅清除内存缓存
- func clearCache() {
- lock.lock()
- cache.removeAll()
- lock.unlock()
- }
- }
|