2016-11-04 6 views
0

レルムオブジェクトのリストタイプの値を観察する必要があります。レルムを観察するときに "古い"値を取得する方法kvoのリストタイプ

オブザーバーが呼び出されたときに新しい値と古い値にアクセスする必要があります。

問題は、observeValueForKeyPath関数の "old"値にアクセスできないという問題です。

この機能で「変更」を記録すると、従来の「古い」&「新規」の代わりに次のように表示されます。

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

実際にレルムにオブジェクトを追加するコードのどこにも表示されません。 Objectのコレクションプロパティを監視しているだけなので、 'change'パラメータで個々の要素ではなくコレクションへの変更を取り戻します。 –

+0

レルムに保存されているかどうかにかかわらず、レルムオブジェクトモデルを観察する必要があります。 – Bigair

答えて

1

まず、私は、レルムKVO hereに関するドキュメントの良い読み物をお勧めします。レルムにまだ追加されていないアンマネージオブジェクトにオブザーバを追加してオブジェクトをDBに追加することはできませんので、それに基づいてオブザベーション戦略を設計することになります:

Objectサブクラスの管理されていないインスタンスのプロパティを観察すると、 は他の動的プロパティと同じように動作しますが、 realm(addm) 。

上記の引用符から別の鍵を借りて、アンマネージドレルムモデルオブジェクトを観察することは、「通常の」非レルムオブジェクトを観察することと変わりありません。あなたの例では、DBにオブジェクトを追加しないので、これはまさにあなたがやることです。

あなたはコレクション(users)を観察しています。何かがコレクションに追加されるたびに通知を受け取りますが、コレクション内のオブジェクトの新しい値ではなく、変更されたコレクションに関するものです。 .indexesKey上記exempleで

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

新しく追加されたオブジェクトのインデックスを指し、.newKeyが新たに追加されたオブジェクトを指します。

コレクション内のオブジェクトのプロパティの値を変更すると、通知は一切受け付けられません。

この種の通知を受けるには、コレクション内の各オブジェクトを観察する必要があります。

関連する問題