Objective C Delegate oder C-style Block Callback?

8

Ich entwerfe eine Klasse, die Ereignisse "feuert", wenn etwas passiert. Diese Ereignisse sind in der Regel nicht mit der Benutzeroberfläche verbunden. Ich frage mich, was die beste Methode dafür ist. Ich habe es entweder erforscht:

Delegierte

Ich werde eine Delegate-Klasse definieren, einen Delegaten in der init-Funktion akzeptieren und die Methoden für die Delegate-Klasse aufrufen, wenn ein Ereignis eintritt.

Blöcke im C-Stil

Ich definiere einen Funktionszeiger und akzeptiere eine Funktion in der init Funktion. Ich rufe es an, wenn ein Ereignis eintritt.

In beiden Fällen muss ich möglicherweise mehrere "Quellen" verarbeiten, daher brauche ich ein Array von Delegaten oder Blöcken.

Ich habe festgestellt, dass bei der iOS-Programmierung Delegierte besonders für UI-Frameworks bevorzugt werden. Aber ich komme aus einem funktionalen Programmierhintergrund, wo ich definitiv mit dem Akzeptieren von Funktionspunkten und dem Übergeben von Lambdas an der Aufrufseite vertraut bin, und ich mag, dass der Compiler Hubvariablen für Sie handhabt und Sie im Allgemeinen weniger Klassenzustand benötigen. Aber ich sehe, dass viele iOS-Entwickler Delegierte verwenden.

Was ist der allgemein bevorzugte Mechanismus in iOS dafür?

    
tng 14.02.2014, 05:36
quelle

3 Antworten

18

Jeder hat seinen Nutzen.

Delegierte sollten verwendet werden, wenn es mehrere "Ereignisse" gibt, über die der Delegierte informiert werden kann und / oder wenn die Klasse Daten vom Delegaten abrufen muss. Ein gutes Beispiel ist mit UITableView .

Ein Block wird am besten verwendet, wenn es nur ein (oder vielleicht zwei) Ereignisse gibt. Ein Abschlussblock (und möglicherweise ein Fehlerblock) sind ein gutes Beispiel dafür. Ein gutes Beispiel ist mit NSURLConnection sendAsynchronousRequest:queue:completionHandler: .

Eine dritte Option sind Benachrichtigungen. Dies wird am besten verwendet, wenn möglicherweise mehrere (und unbekannte) interessierte Parteien an den Ereignissen beteiligt sind. Die anderen beiden sind nur nützlich, wenn es eine (und bekannte) interessierte Partei gibt.

    
rmaddy 14.02.2014, 05:42
quelle
0

Die Verwendung von Delegaten bedeutet eine engere Kopplung in Bezug auf die Architektur als die Verwendung einfacher Callback-Blöcke. Und für nicht komplexe Fälle können Delegierte ein Overkill sein.

Das Speichern von Blöcken in einem Container ist in Ordnung, aber Sie sollten über die Möglichkeit nachdenken, sie irgendwann später zu entfernen (dies erfordert etwas Arbeit), ich meine eine zusätzliche Schnittstelle zum Entfernen eines bereits hinzugefügten Handlers.

>     
Migun 14.02.2014 07:24
quelle
0

Für Ihren Anwendungsfall scheint NSNotification die beste Wahl zu sein. Objekte, die diese Ereignisse benötigen, können sich für diese Benachrichtigungen registrieren.

    
orkoden 14.02.2014 16:30
quelle

Tags und Links