Ich möchte benachrichtigt werden, wenn die Zählung, dh. Anzahl der Elemente in einem NSArray ändert sich .. Natürlich würde ich das nicht benötigen, wenn ich die Kontrolle über das Hinzufügen und Entfernen von Objekten in das Array hätte. Aber ich bin es nicht, es geschieht unvorhersehbar in Bezug auf Business Process Model und hängt von externen Faktoren ab. Gibt es eine einfache elegante Lösung?
EDIT: Ich korrigiere das natürlich zu NSMutableArray ..
Sie müssen KVC verwenden. Aber wie soll ich es machen? Schließlich ist NSMutableArray für seine Mutationsmethoden oder Inhaltsänderungen nicht Key-Value-Coding-konform. Die Antwort ist Proxying -als Unterklassen NS [Mutable] Array ist viel zu viel Aufwand.
NSProxy ist eine großartige kleine Klasse, mit der Sie die an Ihr Array gesendeten Nachrichten abfangen können, als ob Sie ein NSMutableArray wären, und diese dann an eine interne Instanz weiterleiten. Leider ist es auch nicht KVC-konform, da die Innereien von KVC in NSObject leben. Das müssen wir dann benutzen. Eine Beispielschnittstelle könnte etwa so aussehen:
%Vor% Wie Sie sehen, simulieren wir eine Schnittstelle für NSMutableArray
, was notwendig ist, da unser Proxy alles so implementieren sollte, als wäre es ein NSMutableArray
. Dies macht auch die Implementierung so einfach wie möglich, da wir die Selektoren einfach an unseren inneren NSMutableArray
-Zeiger weiterleiten können. Der Kürze halber werde ich nur zwei Methoden implementieren, um Ihnen zu zeigen, wie eine allgemeine Gliederung aussieht:
Wenn Sie keine Möglichkeit haben, ein solches Array zu umbrechen, versuchen Sie, Ihren Code zu überdenken. Wenn eine externe Abhängigkeit Sie in diese Art von Ecke zwingt, versuchen Sie, sie zu entfernen. Es ist immer eine schlechte Sache, mit eigenen Werkzeugen zu arbeiten.
Um Änderungen in einem mutableArray zu beobachten, muss man ein veränderliches Proxy-Objekt verwenden, das von
gegeben wird %Vor%was KVO-konform ist, d. h. jede Änderung von Proxy-Objekt-Senden wird Benachrichtigungen ändern / haben.
Die folgende Demo-Klasse zeigte die vollständige Implementierung
%Vor% Nun sehen Sie jedes Mal, wenn Sie ein Objekt in items
hinzufügen oder entfernen, eine neue Anmeldekonsole ( observeValueForKeyPath
wird aufgerufen).
Jede direkte Änderung des automatisch synthetisierten Arrays ivar _items
hat keine Auswirkung.
Beachten Sie auch, dass Sie den Beobachter auf _items.@count
einstellen müssen (das Beobachten von items.@count
ist sinnlos).
Beachten Sie, dass Sie _items
oder self.items
nicht initialisieren müssen. Es wird hinter der Szene gemacht, wenn Sie items
getter aufrufen.
Jedes Mal, wenn Sie das "Array" items
ändern, erhalten Sie das neue Objekt _items
mit neuer Adresse. Aber ich kann es immer noch über items
proxy getter finden.
Tags und Links objective-c ios nsarray