2010-12-06 15 views
5

Ich habe kürzlich die Videos "Netzwerk-Apps für das iPhone OS" für die WWDC 2010 in iTunes U angeschaut und der Sprecher sagte, dass der beste Ort, um Ihren Netzwerkcode zu schreiben, im Modell liegt. Diese Art von verwirrt mich, weil ich diesen Code immer in den Controller-Klassen platziert habe. Kann jemand bitte erklären, warum dies der beste Ort für den Netzwerkcode ist? Auch wenn möglich, bitte geben Sie ein Beispiel, Code oder Pseudocode, entweder funktioniert.ios Netzwerkcode im Modell?

Antwort

8

Ich frage mich, ob wir alle die gleiche Terminologie verwenden? Hier ist, was ich verwenden würde und ich denke (obwohl ich das ohne viel Kontext sage), was der WWDC-Presenter bedeutete:

  • Modell. Die Daten
  • Ansicht. Wie sieht es in der UI aus
  • Controller. Die Schicht, die dann zwischen dem Modell und der Ansicht vermittelt
  • Mit diesen Definitionen ist der Controller ein schrecklicher Ort, um Netzwerkcode zu behalten. Es hat nichts mit der Interaktion zwischen der Benutzeroberfläche und den Daten zu tun.

    Natürlich gibt es keinen Grund, warum Sie nicht mehrere Klassen für Ihr Modell haben könnten: eines für die Datendarstellung und ein anderes für die Vermittlung zwischen Ihrem Webservice und Ihrem Datenmodell. In diesem Sinne wäre es ein Controller, wäre aber dennoch in der Modellschicht der Anwendung.

    +0

    Ich beziehe mich auf Netzwerkcode, der zum Beispiel Datensätze herunterladen würde, um mit Kerndaten oder etwas ähnlichem zu synchronisieren. Also sollte der Netzwerkcode dafür in den Modellklassen gehen. Ich dachte Modellklassen wären hauptsächlich Domänenobjekte, die zur Darstellung von Daten verwendet werden, ich verstehe nicht, wo das Netzwerk hineinpasst. Heißt das vielleicht eine Art Managerfassade, die das kann, und vielleicht meint er, dass diese Klasse im Modell wäre? Ich denke ich bin vielleicht verwirrt, wo im Code dieser Code hingehen sollte und welche Klassen das Modell tatsächlich repräsentieren. – marchinram

    +0

    Ich denke, deine Definition des Modells ist zu eng. Ich würde sagen, dass das Modell Code ist, der mit den Daten arbeitet, ohne Rücksicht darauf, wie es in der Benutzeroberfläche funktioniert. Dies bedeutet, dass der Netzwerkcode im Modell _layer_ ist, aber nicht unbedingt dieselbe _class_ wie Ihr Domänenobjekt. –

    +0

    OK cool, also wurde ich gerade zu sehr auf dem Modell aufgehängt, das die Domain-Klassen ist, danke +1 – marchinram

    2

    Hmmm ... das scheint eine ziemlich seltsame Bemerkung zu sein, aber dann wieder, vielleicht ist es in einigen Kontexten gültig. Sicher, ich weiß, dass meine Modelle am Ende viel Netzwerkcode haben;

    Das heißt, das Modell sollte alles handhaben, was mit den Daten zu tun hat und darauf zugreifen. Das bedeutet, dass das Modell den Code für die Verbindung mit dem Sicherungsspeicher für die Daten enthält.

    Teile des Modells enthalten möglicherweise keinen Netzwerkcode, wenn die Daten lokal sind. Bedenken Sie jedoch, dass Netzwerkcode verwendet wird, um Daten von irgendwo zu anderen zu übertragen; Wenn Sie zuerst anhand von Modellen codieren, wird wahrscheinlich folgen, dass so ziemlich Ihr gesamter Netzwerkcode dort ankommt.

    2

    Was ist Call-Modell in diesem Beitrag in der Tat ist die Domain-Schicht und der Datencontainer nicht zwischen Controllern und Ansichten verwendete

    Netzwerkbetrieb ist in der Regel asynchron und Ihr Modell ist am wahrscheinlichsten seiner Antwort zu handhaben während der Controller durch die Navigation zwischen der Anfrage und der Antwort zerstört worden sein könnte. Das könnte Ihre Anwendung zum Absturz bringen, weil der Delegate (der Controller in Ihrem Fall) nicht mehr im Speicher vorhanden ist und zumindest Speicherleck erzeugt, weil der Delegat allgemein dafür verantwortlich ist, das Verbindungsobjekt freizugeben.

    +1

    Die Antwort hier ist, um sicherzustellen, dass die Controller-Objekte alle Inflight-Anforderungen abbrechen können, und/oder Singleton-Controller verwenden, die eine große Anzahl von Anforderungen aus mehreren Quellen verwalten können. Tatsächlich würde ich das genaue Gegenteil von dem, was Sie vorgeschlagen haben argumentieren - Modellobjekte sollten viel transitorischer sein als Controller-Objekte, da sie nur existieren sollten, um kleine Datenscheiben in der Anwendung darzustellen. –

    +0

    Die Verwirrung kommt von der Tatsache, dass MVC das Konzept des Modells für Ansichten bringen, die ich "Ansichtsmodell" nenne, und ich beziehe mich darauf, wenn ich über das Modell rede, während das, was ich Modell (VS ViewModel) nenne, tatsächlich was ist call domain, repository, business layer, ... Ich stimme natürlich völlig zu, dass Netzwerkcode in ViewModels, die im Grunde Datencontainer sind, nicht passieren sollte. – VdesmedT

    4

    Ich denke, das Modell ist ein extrem schrecklicher Ort, um jede Art von Netzwerk-Code zu implementieren. Da Netzwerkoperationen auf asynchrone Weise ablaufen sollten, ist ein Controller-Objekt am besten geeignet, um die Komplexitäten zu handhaben, die mit dem Abfeuern von Anforderungen und dem Behandeln der Antwort verbunden sind. Es macht Sinn, dass ein Modellobjekt weiß, wie es sich aus heruntergeladenen Daten (z. B. XML oder JSON) zusammensetzt, aber der größte Teil des Service-Codes, den ich in Modellobjekten gesehen habe, ist schlecht geschriebenes, synchrones Netzwerk.

    1

    Die "Vernetzung ist am besten in das Modell getan" ist, wie Sie explizit sagen, von Apple Netzwerk-Guru Quinn The Eskimo während der WWDC 2010 Sitzung erwähnt.Nachdem ich kürzlich zwei ziemlich große Apps mit umfassendem Networking fertiggestellt habe, bin ich sehr daran interessiert, bei meinem nächsten Projekt etwas anderes zu probieren, entsprechend den Empfehlungen von Apple.

    Es ist jedoch eine seltsame Sache, dass Sie im Allgemeinen Tonnen von Ressourcen auf iOS-Entwicklung finden können, aber damit habe ich wirklich Mühe gehabt, irgendwelche Informationen zu finden. Das heißt, auf der iOS-Netzwerkarchitektur suchen und im Modell vernetzen, und so weiter. Das war, bis ich vor kurzem eine ähnliche Frage auf Apples Dev-Foren gestellt habe. Quinn lieferte eine sehr hilfreiche Antwort. Sie können es hier lesen: LinkedImageFetcher and Network Code in the Model

    Quinn wies darauf hin, dass die beste Probe zu zeigen, das ist MVCNetworking

    auch, dass trotz nicht die Zeit, um die Probe mit Core Data, NSURLSession, und so weiter zu aktualisieren gehabt zu haben, er fühlt immer noch, dass "die grundlegende Architektur von MVCNetworking ist ziemlich solide."

    Schließlich wurde dieser Beitrag auch referenziert; sieht aus wie es einige wirklich gute Verbindungen hat: Für das Modell im Modell Teil einer App ... gehen

    MVCNetworking on iOS 5

    0

    Networking, Parsen, ecc ... sicherlich meine ich den Teil der MVC-Muster nicht streng auf dem Modelldarstellungsobjekt.

    Ich werde denken, eine Struktur zu bauen, wie so:

    Wenn die Steuerung für einige Daten zum Modell fragt, ist es eine Abhängigkeit zu einer Art von Netzwerk-Manager hat, jetzt das einzig Think Modell hat zu tun rufen Sie eine Methode auf (in einem Protokoll angegeben) und warten Sie auf die Antwort (offensichtlich asynchron). Der Netzwerk-Manager hat einen Verweis auf eine angegebene Klasse, die dafür verantwortlich ist, dass das Netzwerk aufruft und Rohdaten zurückgibt. Wenn ein Abschlussblock ausgelöst wird, gibt der Network Manager diese Daten an ein Parser-Objekt weiter (offensichtlich mit einer in einem Protokoll angegebenen Methode)), warte auf die Antwort und wenn die Daten abgerufen und geparst sind, wird das Array, das Wörterbuch oder was Sie benötigen an das Modell mit den darin aktualisierten Daten zurückgegeben, nachdem all dies wieder an den Controller übergeben werden kann, um ein reloadData oder ähnliches zu erstellen also und aktualisiere Ansichten mit aktualisierten Daten.

    Ich hoffe, dass es hilfreich wäre.