[英]Observing all properties in a struct or class in swift
我有一個 iOS 應用程序,我想在其中使用 Google Cloud Firestore 來存儲用戶首選項,但是在更改任何Settings
結構的屬性后,我無法提出一個優雅的解決方案來調用我的saveSettingsToFirestore()
函數。
我當然不想在應用程序中修改設置的每個實例之后手動調用我的saveSettingsToFirestore()
函數。 我想我可以在這個 Settings 結構中的所有 15 個以上的屬性上放置一個單獨的“didSet”屬性觀察器,但這看起來很難看,我無法想象這是最佳實踐。
我考慮過 KVO,但我找不到一個很好的例子來涵蓋我的情況,而且我在設置它時遇到了麻煩。
同樣,如果您有更好的解決方案來管理與用戶帳戶關聯的一組變量,請告訴我。 我特別不使用 NSUserDefaults,因為我想將數據與用戶 ID 相關聯,而不是用戶的 iCloud 帳戶。
這是我試圖觀察的結構:
struct Settings: Codable {
static var shared = Settings()
var hideTimesAfter = "10:00 PM"
var hideTimesBefore = "5:00 AM"
var increment = 15
var nextColorIndex = 1
var adsEnabled = true
var alertsEnabled = true
var bugShakeEnabled = true
var didSeeIOSUpdateRequest = false
var firstTime = true
var isIdleTimerDisabled = false
var notificationsEnabled = true
var premiumEnabled = false
var soundsEnabled = true
var twentyFourHourModeEnabled = false
var vibrationsEnabled = true
private init() { }
}
這是我嘗試將該struct
重組為帶有觀察者的 NSObject class
,但我仍在嘗試弄清楚什么會發生在何處,並希望得到任何見解。
class Settings: NSObject, Codable {
static let shared = Settings()
@objc dynamic var hideTimesAfter = "10:00 PM"
@objc dynamic var hideTimesBefore = "5:00 AM"
@objc dynamic var increment = 15
@objc dynamic var nextColorIndex = 1
@objc dynamic var adsEnabled = true
@objc dynamic var alertsEnabled = true
@objc dynamic var bugShakeEnabled = true
@objc dynamic var didSeeIOSUpdateRequest = false
@objc dynamic var firstTime = true
@objc dynamic var isIdleTimerDisabled = false
@objc dynamic var notificationsEnabled = true
@objc dynamic var premiumEnabled = false
@objc dynamic var soundsEnabled = true
@objc dynamic var twentyFourHourModeEnabled = false
@objc dynamic var vibrationsEnabled = true
func updateDate() {
print("yo firestore, get this shit")
}
let observed = Settings.shared
let observer = MyObserver(object: observed)
}
class MyObserver: NSObject {
@objc var objectToObserve: Settings
var observation: NSKeyValueObservation?
init(object: Settings) {
objectToObserve = object
super.init()
observation = observe(
\.objectToObserve.adsEnabled,
options: [.old, .new]
) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}
}
如果所有(或幾乎所有)這些設置都是從單個視圖控制器中更改的,那么我不會考慮 KVO 模型或放棄對較新框架的操作系統支持,因為您的問題確實比應該簡單得多的問題要簡單得多解決方案。
您不應該關心這些設置的單個值更改,因為這意味着您關心每次用戶更改數據庫時更新數據庫。 即使有 Firestore 的定價模式,這也不是很有效。 您應該關心的是,當用戶完成視圖控制器的任何值更改時,如果更改了,那么您想要更新用戶下方的數據庫(他們不需要等待或點擊保存按鈕,因為Firestore 具有離線功能)。
因此,當用戶打開這個視圖控制器時,只需將這些設置的當前值記錄在視圖控制器本身中(可能在viewDidLoad
),當用戶離開視圖控制器時,檢查是否有任何值發生了變化(可能在viewWillDisappear
) ——如果是這樣,更新數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.