レルムオブジェクトのリストタイプの値を観察する必要があります。レルムを観察するときに "古い"値を取得する方法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)
}
}
実際にレルムにオブジェクトを追加するコードのどこにも表示されません。 Objectのコレクションプロパティを監視しているだけなので、 'change'パラメータで個々の要素ではなくコレクションへの変更を取り戻します。 –
レルムに保存されているかどうかにかかわらず、レルムオブジェクトモデルを観察する必要があります。 – Bigair