Klasa ma właściwość (i instancję var) typu NSMutableArray z syntezowanymi akcesoriami (przez @property
). Jeśli obserwować tę tablicę używając:Obserwacja obiektu NSMutableArray do wstawiania/usuwania
[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
A potem wstawić obiekt w tablicy tak:
[myObj.theArray addObject:NSString.string];
... An observeValueForKeyPath zgłoszenie jest nie wysłana. Jednak dodaje robi wysyłać prawidłowe zgłoszenie:
[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
To dlatego mutableArrayValueForKey
zwraca obiekt proxy, który dba o powiadamianie obserwatorów.
Ale czy syntetyzowane dodatki nie powinny automatycznie zwracać takiego obiektu proxy? Jaki jest właściwy sposób obejścia tego problemu - czy powinienem napisać niestandardowy akcesor, który po prostu wywołuje [super mutableArrayValueForKey...]
?
Świetna rada, dzięki. –
Problem nr 1 polega na tym, że dodając obserwatora, obserwujesz właściwość jakiegoś obiektu. Tablica jest wartością * tej właściwości, a nie samą właściwością. Dlatego musisz użyć akcesorów lub -mutableArrayValueForKey: aby zmodyfikować tablicę. –
Twoja ostatnia kwestia wydaje się być nieaktualna - otrzymuję bezpłatne powiadomienia KVO o właściwościach NSArray, pod warunkiem, że zaimplementuję zarówno dodawanie, jak i usuwanie akcesorów. – Bryan