簡體   English   中英

斯威夫特3:單身人士的財產觀察員

[英]Swift 3: Property observer for singleton

我想知道是否有任何方法可以觀察單例類的屬性ony的變化

在我的情況下,使用Realm我有類似的東西

class User: Object {
   dynamic var name:String = ""
   dynamic var email:String = ""
   dynamic var id:String = ""
   dynamic var picURL:String = ""
   dynamic var pic:Data = Data()

    static let currentUser = User()
    {
        didSet
        {
            try! realm.write {
                realm.add(currentUser, update: true)
            }
    }
  }
}

我想要實現的是我想在我的應用程序中只有一個用戶對象,並且任何時候任何屬性都被修改,我想將它保存到Realm。

但是,上面的示例顯示錯誤

'let'聲明不能觀察屬性

你會怎么做? 您是否認為我的想法是讓Realm對象單例並隨時更新它的某些屬性更改是一個好主意?

我想知道擁有Realm持久化的類的單例對象是否真的有意義。

好吧,如果你只有一個用戶,你應該把這個觀察者放在每個變量中,而不是放在let用戶中 在那里你可以調用一種方法進行用戶更新。

dynamic var name: String {
    didSet{
        User.updateOnRealm()//create this method
    }
}

要編寫更新方法,您必須編寫類似這樣的內容

class func updateOnRealm() {
    //update code here
}

目前不可能為單個Realm Object配備一個單獨的觀察者,但是在Realm GitHub中跟蹤它一個問題 ,我相信它現在被優先考慮。

Alcivanio是正確的,因為您需要手動觸發更新事件以確保更改持久保存到Realm。 話雖如此,因為Realm控制持久化對象中的訪問器, didSet一旦將對象保存到Realm,就不能保證調用didSet 為簡單起見,我建議使用閉包來更新用戶對象。

更新的答案:如果您的單例是一個領域Object ,則無法在寫入事務之外修改其屬性。 就像我在下面寫的那樣,最簡單的方法是擁有一個管理Realm寫事務的update閉包,並且只需更新其中的Singleton對象的屬性。

正如你也看到了,你不能使用didSet與定義的屬性let ,所以它可能是最好回落到Objective-C的約定,並使用內部的實例變量。

所以一切,也許考慮這樣做:

fileprivate var _current: User? = nil

class User: Object {
    dynamic var name:String = ""
    dynamic var email:String = ""
    dynamic var id:String = ""
    dynamic var picURL:String = ""
    dynamic var pic:Data = Data()

    static var current: User
    {
        if _current == nil {
            let realm = try! Realm()

            // Query for an existing user
            _current = realm.objects(User.self).first

            // Create a new user if it didn't exist in Realm
            if _current == nil {
                 _current = User()
                 try! realm.write { realm.add(_current) }
            }
        }
        return _current
    }

    public func update(_ block: (() -> Void)) {
        let realm = try! Realm()
        try! realm.write(block)
    }
}

let user = User.current
user.update {
    user.name = "DCDC"
}

根據你所寫的內容:

我想要實現的是我想在我的應用程序中只有一個用戶對象,並且任何時候任何屬性都被修改,我想將它保存到Realm。

我會建議這個解決方案:

  1. 創建一個不使用Singleton模式的class User

  2. 創建一個符合Singleton模式的class UserManager

  3. A User創建自定義setter方法。 在這些setter中,您可以更改用戶屬性WITH或WITHOUT寫入數據庫。 您還可以檢查使用INPUT(將名稱設置為小寫等)。

使用這種方法,您可以輕松地測試您的User類,擴展它,子類和重用。

如果您需要以下代碼片段評論=)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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