Witam każdego lata czytając StackOverflow, teraz zdecydowałem się dołączyć. Staram się rozwiązać ten problem:KVO addObserver do relacji jeden-do-wielu obiektów CoreData
Mam jednostkę "Depot", która ma dwa do wielu relacji "Osoby" i "Ciężarówki". Chcę zaobserwować, kiedy, biorąc pod uwagę obiekt "Depot", są zmiany (wstaw, usuń) w jednym z relacji (i zrozum, w którym).
Obecnie robię tak:
[mydepot addObserver:self forKeyPath:@"Trucks" options:NSKeyValueObservingOptionNew context:nil];
i
[mydepot addObserver:self forKeyPath:@"Persons" options:NSKeyValueObservingOptionNew context:nil];
ale za każdym razem coś się zmienia w jednym z dwóch powiązanych zbiorów, observeValueForKeyPath
jest wywoływana dwukrotnie (raz dla każdego keypath).
Czy robię to źle? Patrząc na "zmianę" dict, (obserwując również z OptionOld) nie widać żadnych nieoczekiwanych zmian (kiedy zmieniam osoby, ciężarówki się nie zmieniają), ale powiadomienie wciąż jest wywoływane.
Dzięki Pietro
edit: wydaje się, że oba razy „zmiana” dict zawiera całą relacji w „nowej” polu. (oczywiście jednorazowo osoby i jednorazowe ciężarówki)
edit2: jak to się dzieje, nawet przy korzystaniu z prostych właściwości, czy może być powiązany z operacją składowania managedctx? tak jakby po zapisaniu cały obiekt został uznany za zmieniony.
+1 Zgadzam się. Zastanów się, jak zmodyfikować istniejący zbiór wartości, zamiast zastępować całą kolekcję inną kolekcją. – Caleb
Dzięki, tak, ale Depot jest podklasą CoreData NSManagedObject, więc powinien już wdrożyć akcesory zgodne z KVO. I robię to, co mówisz, jako fakty dodam tylko nowy element do relacji, nigdy nie zastępując/ustawiając cały zestaw (relację). Dlatego nie mogę tego zrozumieć. Jakbym obserwował dla dwóch keypathów, na przykład "Trucks" i "sqmeters" (to nie jest relacja), jeśli "sqmeters" zostanie zmodyfikowany, wyzwalane są dwa powiadomienia (również jeden dla "ciężarówek" kpath) – Peterdeka
Ścieżki kluczy mogą zależeć od siebie ... może to się dzieje? W przeciwnym razie będziesz musiał szukać gdzie indziej. – nielsbot