[英]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。
我會建議這個解決方案:
創建一個不使用Singleton模式的class User
。
創建一個符合Singleton模式的class UserManager
為A
User創建自定義setter方法。 在這些setter中,您可以更改用戶屬性WITH或WITHOUT寫入數據庫。 您還可以檢查使用INPUT(將名稱設置為小寫等)。
使用這種方法,您可以輕松地測試您的User
類,擴展它,子類和重用。
如果您需要以下代碼片段評論=)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.