簡體   English   中英

快速觀察結構或類中的所有屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM