Commit dc481cce by Demid Merzlyakov

IOS-200: add support for UserDefaults customization to the UserDefaults wrappers.

parent 4d6f4b51
...@@ -11,18 +11,20 @@ import Foundation ...@@ -11,18 +11,20 @@ import Foundation
@propertyWrapper @propertyWrapper
public struct UserDefaultsOptionalValue<T> { public struct UserDefaultsOptionalValue<T> {
public let key: String public let key: String
private let userDefaults: UserDefaults
public init(_ key: String) { public init(_ key: String, userDefaults: UserDefaults) {
self.key = key self.key = key
self.userDefaults = userDefaults
} }
public var wrappedValue: T? { public var wrappedValue: T? {
get { get {
return UserDefaults.standard.object(forKey: key) as? T return userDefaults.object(forKey: key) as? T
} }
set { set {
UserDefaults.standard.set(newValue, forKey: key) userDefaults.set(newValue, forKey: key)
UserDefaults.standard.synchronize() userDefaults.synchronize()
} }
} }
} }
...@@ -12,10 +12,12 @@ import Foundation ...@@ -12,10 +12,12 @@ import Foundation
public struct UserDefaultsValue<T> { public struct UserDefaultsValue<T> {
public let key: String public let key: String
public let defaultValue: T public let defaultValue: T
private let userDefaults: UserDefaults
public init(_ key: String, defaultValue: T) { public init(_ key: String, defaultValue: T, userDefaults: UserDefaults) {
self.key = key self.key = key
self.defaultValue = defaultValue self.defaultValue = defaultValue
self.userDefaults = userDefaults
} }
public var wrappedValue: T { public var wrappedValue: T {
...@@ -23,8 +25,8 @@ public struct UserDefaultsValue<T> { ...@@ -23,8 +25,8 @@ public struct UserDefaultsValue<T> {
return (UserDefaults.standard.object(forKey: key) as? T) ?? defaultValue return (UserDefaults.standard.object(forKey: key) as? T) ?? defaultValue
} }
set { set {
UserDefaults.standard.set(newValue, forKey: key) userDefaults.set(newValue, forKey: key)
UserDefaults.standard.synchronize() userDefaults.synchronize()
} }
} }
} }
...@@ -6,9 +6,21 @@ ...@@ -6,9 +6,21 @@
// //
import Foundation import Foundation
import WidgetKit
@propertyWrapper @propertyWrapper
public struct UserDefaultsUnitValue<T> { public struct UserDefaultsUnitValue<T> {
private let key: String
private let defaultValue: T
private var lastKnownValue: T?
private let userDefaults: UserDefaults
public init(wrappedValue defaultValue:T, key:String, userDefaults: UserDefaults) {
self.defaultValue = defaultValue
self.key = key
self.userDefaults = userDefaults
}
public var wrappedValue: T { public var wrappedValue: T {
get { get {
// TODO: If we will ever have 2 instances of UserDefaultsUnitValue with the same key at the same time, this cache will become desynchronized. // TODO: If we will ever have 2 instances of UserDefaultsUnitValue with the same key at the same time, this cache will become desynchronized.
...@@ -16,7 +28,7 @@ public struct UserDefaultsUnitValue<T> { ...@@ -16,7 +28,7 @@ public struct UserDefaultsUnitValue<T> {
return knownValue return knownValue
} }
guard guard
let data = UserDefaults.standard.data(forKey: key), let data = userDefaults.data(forKey: key),
let decoded = NSKeyedUnarchiver.unarchiveObject(with: data) as? T let decoded = NSKeyedUnarchiver.unarchiveObject(with: data) as? T
else { else {
return defaultValue return defaultValue
...@@ -27,46 +39,46 @@ public struct UserDefaultsUnitValue<T> { ...@@ -27,46 +39,46 @@ public struct UserDefaultsUnitValue<T> {
set { set {
lastKnownValue = newValue lastKnownValue = newValue
let data = NSKeyedArchiver.archivedData(withRootObject: newValue) let data = NSKeyedArchiver.archivedData(withRootObject: newValue)
UserDefaults.standard.set(data, forKey: key) userDefaults.set(data, forKey: key)
UserDefaults.standard.synchronize()
Settings.shared.delegate.invoke { (delegate) in Settings.shared.delegate.invoke { (delegate) in
delegate.settingsDidChange() delegate.settingsDidChange()
} }
if #available(iOS 14, *) {
WidgetCenter.shared.reloadAllTimelines()
}
} }
} }
}
@propertyWrapper
public struct UserDefaultsBasicValue<T> {
private let key: String private let key: String
private let defaultValue: T private let defaultValue: T
private var lastKnownValue: T? private let userDefaults: UserDefaults
init(wrappedValue defaultValue:T, key:String) { public init(wrappedValue defaultValue:T, key:String, userDefaults: UserDefaults) {
self.defaultValue = defaultValue self.defaultValue = defaultValue
self.key = key self.key = key
self.userDefaults = userDefaults
} }
}
@propertyWrapper
public struct UserDefaultsBasicValue<T> {
public var wrappedValue: T { public var wrappedValue: T {
get { get {
let value = UserDefaults.standard.value(forKey: key) as? T let value = userDefaults.value(forKey: key) as? T
return value ?? defaultValue return value ?? defaultValue
} }
set { set {
UserDefaults.standard.setValue(newValue, forKey: key) userDefaults.setValue(newValue, forKey: key)
UserDefaults.standard.synchronize() Settings.shared.delegate.invoke { (delegate) in
delegate.settingsDidChange()
}
if #available(iOS 14, *) {
WidgetCenter.shared.reloadAllTimelines()
}
} }
} }
private let key: String
private let defaultValue: T
init(wrappedValue defaultValue:T, key:String) {
self.defaultValue = defaultValue
self.key = key
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment