2012-03-31 7 views
10

Also, ich habe 2 Arten von Daten, einige müssen beibehalten werden und einige nicht.iPhone - Architektur für ViewController und Netzwerkanfragen

Ich denke darüber nach, wo alle meine netzwerkbezogenen Code, in meinem UIViewControllers, wo alle Netzwerkanforderung starten, oder in einer anderen Schicht.

Was ich im Sinn hatte, ist dies:

eine Schicht NetworkManager genannt haben. NetworkManager ist singerlton für alle meine Web-Service-Anrufe.

Für Daten, die persistent sein müssen und in einer Liste angezeigt werden können, würde ich Netzwerkmanager die Anforderung ausgeben, die Antwort in meinem lokalen Kerndaten DB speichern und meine UIViewController hören diese Daten mit FetchResultsController.

Aber es gibt viele andere Arten von Anfragen. Zum Beispiel: Login-Anfrage, Benutzer-Info-Anfrage, friendsNearBy, und so weiter ... einige müssen nicht persistent in meiner db sein, und manche passen nicht in die FRC-Architektur.

Für diese Art der Anfrage, soweit ich sehe, gibt es 2 Möglichkeiten der Umgang mit ihm:

1. eine weitere Schicht, die zwischen den Viewcontrollers und der Networkmanager trennt. Nennen wir es Mediator. Die Mediator ruft die Wörterbuch (JSON) -Anfrage vom NetworkManager ab, entscheidet entsprechend der App-Logik, ob noch etwas zu tun ist, und sendet dann eine Benachrichtigung mit dem entsprechenden Namen und den entsprechenden Daten. Wenn der Mediator den UIViewController speichert, der die Anforderung ausgegeben hat, kann er die Antwort direkt an ihn delegieren, anstatt eine Benachrichtigung zu senden.

Der Flow würde so aussehen:

MyUiViewController - > Mediator -> NetworkManger->Mediator-> PostNotification (or directly back to MyUiViewController) 

Pros: 
Decoupling 
Nice structure and separation of concerns 

Cons: 
Harder to code 
Sometimes harder to understand and debug. 

2. Nicht diese 3 Schichten-Architektur mit, sondern MyUiViewControllers, die Ausgabe einer Netzwerkanfrage mit Blöcken. Bedeutet, dass anstelle des Mediators, der die Antwort vor MyUiViewController abfängt, nur MyUiViewController die Antwort mit Blöcken verarbeiten kann, da er derjenige ist, der sie ausgibt.

Pros: 
Simple and quick to code 
Easy to understand 

Cons: 
Coupling of network code inside your controllers 

Ich habe gehofft, Vorschläge und Kommentare zu bekommen, was von Menschen der Erfahrung am besten ist, oder andere/bessere Möglichkeit, dies zu tun.

Antwort

1

Haben Sie schon die beste Methode?

Hier ist, was ich in der Regel tun,

Haben Sie einen Networkmanager, die nicht Singleton ist. Definieren Sie ein Protokoll mit der Methode OnSuccess, OnError. Implementieren Sie dies in Ihrem ViewController, der die Netzwerkverbindung initiiert. Legen Sie den Delegaten auf NetworkManager fest, und lassen Sie den Delegaten beim Ausführen der asynchronen Anforderung aufrufen.

Verwenden Sie Delegaten anstelle von Blöcken, da es einfach zu warten ist.

Dies ist möglicherweise nicht die beste Lösung, aber hoffentlich gibt es Ihnen einige Hinweise.

1

Ich empfehle Option 2 mit ein wenig von dem, was Sie für Option 1 aufgelistet haben.In meinen Apps habe ich zwei verschiedene Betriebsmodi, die gleichzeitig funktionieren.

Automatische Downloads: App wesentliche Daten heruntergeladen und direkt in der Datenbank gespeichert. Es wird jedes Mal initiiert, wenn die App aktiv wird. Nach Abschluss jeder Anfrage wird eine NSNotification für alle sichtbaren View-Controller gesendet, die möglicherweise über die neuen Daten informiert werden müssen.

Zum Beispiel, wenn ich Spielerdaten speichern werde ich eine Benachrichtigung wie "PlayerDataUpdated" senden. Wenn ein View-Controller sichtbar ist, wartet er auf Benachrichtigungen. Wenn es nicht sichtbar ist, wird nicht auf Benachrichtigungen gewartet, da Änderungen in der Datenbank während viewWillAppear entdeckt werden.

Benutzer Initiiert Downloads: Für vom Benutzer initiierte Netzwerkanforderungen, wie Pull zu aktualisieren, sollten Sie die entsprechende Methode auf Networkmanager aus dem View-Controller aufrufen, die die aktualisierten Daten benötigt.

Verwandte Themen