2016-11-04 1 views
0

Мне нужно наблюдать значение типа списка объекта realm.Как получить «старое» значение при наблюдении области Тип списка по kvo

Мне нужно получить новое и старое значение при вызове наблюдателя.

Проблема заключается в том, что не удается получить доступ к «старому» значению в функции observValueForKeyPath.

Если я регистрирую «изменение» в этой функции, вместо обычного «старого» & «Новый» отображается следующее.

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

Я не вижу нигде в вашем коде, где вы фактически добавляете объекты в Царство. Вы просто наблюдаете свойство коллекции объекта, поэтому вы возвращаетесь в параметр «change» для изменений в коллекции, а не для отдельных элементов. –

+0

Мне нужно наблюдать объектную модель области, независимо от того, сохранена она в царстве или нет. – Bigair

ответ

1

Во-первых, я рекомендовал бы хорошо читать из документации о Realm КВО here. Вы заметите, что добавление наблюдателей на неуправляемый объект (не добавляется Realm еще), а затем добавить объект в БД не представляется возможным, так что вы хотите, чтобы разработать стратегию наблюдения на его основе:

Наблюдение свойств неуправляемых экземпляров подклассов объектов работает , как и с любым другим динамическим свойством, но обратите внимание, что вы не можете добавить объект в царство (с помощью realm.add (obj) или других подобных методов ), в то время как у него есть зарегистрированные зарегистрированные наблюдатели ,

Еще одна важная выдержка из приведенной выше цитаты заключается в том, что наблюдение за неуправляемым объектом модели Realm не отличается от наблюдения «нормального» объекта, не относящегося к Царству. В вашем примере это именно то, что вы делаете, так как вы не добавляете какие-либо из ваших объектов в БД.

Итак, вы являетесь KVO, наблюдая коллекцию (users), и вы будете получать уведомления каждый раз, когда что-то добавляется в коллекцию, но это будет о измененной коллекции, а не о новых значениях объектов в коллекции.

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

В Exemple выше .indexesKey относится к индексу вновь добавленного объекта и .newKey относится к вновь добавленного объекта.

Если вы измените значение свойства объекта в коллекции, вы не будете уведомлены вообще!

Для получения такого уведомления вам необходимо будет наблюдать за каждым объектом в коллекции.

Смежные вопросы