LNUserDefaults.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // LNUserDefaults.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/6.
  6. //
  7. import Foundation
  8. var LNUserDefaults: LNUserDefaultsManager {
  9. LNUserDefaultsManager.shared
  10. }
  11. class LNUserDefaultsManager {
  12. static let shared = LNUserDefaultsManager()
  13. private init() {}
  14. // 内存缓存容器
  15. private var cache: [String: Any] = [:]
  16. private let lock = NSLock()
  17. private let userDefaults: UserDefaults = {
  18. return .standard
  19. }()
  20. subscript<T: Codable>(_ key: LNUserDefaultsKey, _ defaultValue: T) -> T {
  21. value(forKey: key) ?? defaultValue
  22. }
  23. subscript<T: Codable>(_ key: LNUserDefaultsKey) -> T? {
  24. get {
  25. value(forKey: key) ?? nil
  26. }
  27. set {
  28. save(newValue, forKey: key)
  29. }
  30. }
  31. /// 存储数据(自动编码)
  32. private func save<T: Codable>(_ value: T, forKey key: LNUserDefaultsKey) {
  33. do {
  34. let data = try JSONEncoder().encode(value)
  35. userDefaults.set(data, forKey: key.rawValue)
  36. // 更新缓存
  37. lock.lock()
  38. cache[key.rawValue] = value
  39. lock.unlock()
  40. } catch {
  41. Log.e("存储失败(key: \(key)):\(error)")
  42. }
  43. }
  44. /// 读取数据(自动推断类型,无需显式传递 Type.self)
  45. private func value<T: Codable>(forKey key: LNUserDefaultsKey) -> T? {
  46. // 优先从缓存读取
  47. lock.lock()
  48. defer {
  49. lock.unlock()
  50. }
  51. if let cached = cache[key.rawValue] as? T {
  52. return cached
  53. }
  54. // 从 UserDefaults 读取并解码
  55. guard let data = userDefaults.data(forKey: key.rawValue) else {
  56. cache.removeValue(forKey: key.rawValue) // 清除无效缓存
  57. return nil
  58. }
  59. do {
  60. let decoded = try JSONDecoder().decode(T.self, from: data)
  61. // 缓存解码后的数据
  62. cache[key.rawValue] = decoded
  63. return decoded
  64. } catch {
  65. Log.e("读取失败(key: \(key.rawValue)):\(error)")
  66. cache.removeValue(forKey: key.rawValue)
  67. return nil
  68. }
  69. }
  70. // 辅助方法:删除数据
  71. func remove(forKey key: LNUserDefaultsKey) {
  72. userDefaults.removeObject(forKey: key.rawValue)
  73. lock.lock()
  74. cache.removeValue(forKey: key.rawValue)
  75. lock.unlock()
  76. }
  77. // 辅助方法:清除所有数据(包括缓存)
  78. func clearAll() {
  79. userDefaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
  80. lock.lock()
  81. cache.removeAll()
  82. lock.unlock()
  83. }
  84. // 辅助方法:仅清除内存缓存
  85. func clearCache() {
  86. lock.lock()
  87. cache.removeAll()
  88. lock.unlock()
  89. }
  90. }