Beobachtete Anzahl in NSMutableArray

7

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 ..

    
Earl Grey 07.04.2012, 23:43
quelle

2 Antworten

15

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:

%Vor%

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.

    
CodaFi 07.04.2012 23:53
quelle
6

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.

    
malex 21.03.2015 16:24
quelle

Tags und Links