2016-03-04 42 views
1

我有一個屬性的實例,我想要偵聽來自其他實例的更新。KVO或如何聆聽從Swift外部的屬性更改

例如class Menu有一個屬性badgeCount,我想監聽badgeCount的任何更新,例如當badgeCount更改時。我希望我的ViewController在修改badgeCount以獲取實際數據後進行回調。

目標是KVO,我可以使用上市的財產,我怎麼可以在Swift中使用KVO。我是Swift新手。

+0

您可以使用志願太,但你必須使用NSObject等。相反,我建議你使用通知或推出自己的更改觀察機制。這兩種選擇都很好,根據情況你可能會比另一個更喜歡。 – Andy

+0

看看邦德框架,他們有一個可以幫助你的Observable類型:https://github.com/SwiftBond/Bond – totiG

回答

3

如果你想迅速使用KVO,有兩個要求:

  • 你想要做的志願必須從NSObject的繼承類(或任何NSObject的子類)
  • 你需要的屬性觀摩必須被標記爲dynamic

一個代碼的例子是:

class Menu: NSObject { 
    dynamic var badgeCount: Int = 0 
} 

然後,你可以使用通常的menuInstance.addObserver(self, forKeyPath: "badgeCount", options: NSKeyValueObservingOptions(), context: nil)

但是這個解決方案不是很多swifty


更好的解決方案是(不是一個詳盡的列表):

使用SWIFT的didSet/willSet調用一些回調

class Menu { 
    var badgeCount: Int = 0 { 
    didSet { 
     badgeCountChangedListener(badgeCount) 
    } 
    } 

    init(badgeCountChangedListener: (Int -> Void)) { 
    self.badgeCountChangedListener = badgeCountChangedListener 
    } 

    private let badgeCountChangedListener: (Int -> Void) 
} 

使用RxSwift'sVariable

class Menu { 
    let badgeCount = Variable(0) 
} 

// and from where you observe 
menuInstance.badgeCount.subscribeNext { badgeCount in 
    print(badgeCount) 
} 
+0

謝謝,但似乎我不能添加menuInstance.addObserver,甚至沒有方法實例名爲addObserver –

+1

,如答案中所述>您要做KVO的類必須從NSObject繼承 – boundsj