2016-11-04 56 views
0

我需要觀察領域對象的List類型值。如何在觀察領域時獲得「舊」值清單類型由kvo

當觀察者被調用時,我需要訪問新的和舊的值。

問題是a不能訪問observeValueForKeyPath函數中的「舊」值。

如果我在該功能中記錄「更改」,它將顯示以下內容而不是傳統的「舊」&「新」。

Optional(["new": <__NSArrayI 0x7fcc8bc57150>(
User { 
} 
) 
, "indexes": <_NSCachedIndexSet: 0x7fcc8bc07970>[number of indexes: 1 (in 1 ranges), indexes: (1)], "kind": 2]) 

這些是什麼意思,我怎樣才能訪問「舊」價值?

import UIKit 
import RealmSwift 

class ValueContainer: Object { 
    let users = List<User>() 
} 

class User: Object { 

} 

class ViewController: UIViewController { 

    let container = ValueContainer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     container.users.appendContentsOf([User(), User(), User(), User()]) 

     container.addObserver(self, forKeyPath: "users", options: [.New, .Old], context: nil) 

    } 

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

     print("---- Observer called ---") 
     print("KeyPath:\(keyPath)") 

     guard let container = object as? ValueContainer else { 
      print("Object cast failed") 
      return 
     } 

     print("Change") 
     print(change) 

    } 


    @IBAction func buttonTap(sender: AnyObject) { 
     container.users.insert(User(), atIndex: 1) 
    } 
} 
+0

我沒有看到代碼中實際將對象添加到Realm的地方。你只是觀察一個Object的一個集合屬性,所以你回到'change'參數集合的變化,而不是單個元素。 –

+0

我需要觀察一個領域對象模型,不管它是否保存到領域。 – Bigair

回答

1

首先,我會建議有關領域志願here的文檔的一個很好看的。您會注意到,將觀察者添加到非託管對象(尚未添加到Realm中),然後將該對象添加到數據庫是不可能的,因此您需要基於此設計觀察策略:

觀察對象子類的非託管實例的屬性與其他動態屬性一樣工作 ,但請注意,您不能將對象添加到Realm(使用realm.add(obj)或其他類似的 方法),但它有任何註冊的觀察者。

上面引用的另一個要點是,觀察非託管Realm模型對象與觀察「正常」非Realm對象沒有什麼不同。在你的例子中,這正是你所做的,因爲你不會將任何對象添加到數據庫中。

因此,您是KVO觀察集合(users),每次向集合中添加內容時都會收到通知,但它將關於已更改的集合,而不是集合中對象的新值。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    print(change?[.indexesKey]) 
    print(change?[.newKey]) 
} 

在上述.indexesKey的爲例指新添加的對象的索引和.newKey指新添加的對象。

如果更改集合中某個對象的屬性的值,則根本不會收到通知!

要獲得這種通知,您必須觀察集合中的每個對象。