Kann jemand MVC in Bezug auf UItableview erklären, wenn Daten für die Tabelle vom Internet erhalten werden?

8

Kann jemand mir erklären, wie MVC funktioniert, wenn es um UITableView geht, besonders wenn man Daten aus dem Internet holt.

Ich möchte genau wissen, was das Modell, die Ansicht und der Controller sind, wenn es um eine UItableview

geht

Ich habe den folgenden ViewController-Code geschrieben, der Daten aus dem Internet bezieht und sie mit AFNetworking-Framework in einer Tabelle anzeigt.

Könnten Sie mir bitte sagen, wie Sie das ändern und in Modell, Ansicht und Controller aufteilen? Ich habe auch eine Refresh-Klasse geschrieben, von der ich vermute, dass sie ein Teil des Modells ist. Können Sie mir sagen, wie genau ich Änderungen vornehmen und sie zu einem Teil des Modells machen kann?

BEARBEITEN: Die folgenden Antworten helfen mir, das Konzept theoretisch zu verstehen. Könnte mir jemand bitte helfen, den Code entsprechend zu ändern (indem ich eine neue Klasse schreibe, wie man das Array zu dieser Klasse aufruft und die Tabelle auffüllt, weil ich einen json benutze Parser). Ich möchte es umsetzen. Und verstehe es nicht nur theoretisch.

%Vor%     
user2877880 21.10.2013, 01:56
quelle

2 Antworten

9

Das ist eine ziemlich große Frage, die Sie stellen. Aber lassen Sie mich antworten, indem Sie es so einfach wie möglich machen.

  • Modell - Ihre Datenquelle; Letztendlich sind es Ihre Webservice-Daten
  • Controller sollte die Eigenschaft besitzen, die die Tabellenansicht besitzt und die Einstellungseigenschaften in Ihrer Ansicht vermittelt und auf Ereignisse in der Ansicht reagiert und bei Bedarf Änderungen am Modell der Ansicht vornimmt
  • View (s) - eine Kombination aus Tabellenansicht und Tabellenansicht

Es gibt viele Möglichkeiten, Ihre Web-Daten mit Ihrer Tabellenansicht zu koordinieren, aber ich würde vorschlagen, Ihre Web-Service-Anrufe in eine separate Store-Klasse umzuwandeln - sagen wir iTunesStore -, dass diese Klasse für die Anrufe verantwortlich ist für den Dienst und das Setzen eines internen Arrays mit den Ergebnissen sollte es auch möglich sein, eine Zeilenanzahl sowie ein bestimmtes Element für einen bestimmten Zeilenindex zurückzugeben.

Diese Klasse reagiert dann auf Aufrufe für die erforderlichen Delegate-Methoden für Tabellenansichten. Andere Dinge, die in Betracht gezogen werden müssen, machen diese andere Klasse zu einem Singleton, sie muss dem UITableviewviewDatasource-Protokoll selbst entsprechen und es als Datenquelle der Tabellensichten zuweisen.

Wie ich schon sagte, eine große Frage mit vielen Optionen für Sie, aber ich habe Ihnen einige Dinge gegeben, um zu überlegen, wohin Sie als nächstes gehen sollen.

AKTUALISIEREN
Ich füge einige Codebeispiele hinzu, um zur Klärung beizutragen. Zu Beginn möchte ich klarstellen, dass ich nicht die Gesamtlösung liefern werde, weil ich dabei zu viel von der notwendigen tatsächlichen Lösung annehmen müsste - und weil es verschiedene Möglichkeiten gibt, mit AFNetworking zu arbeiten , Webservices, etc .... und ich möchte nicht auf die Seite des Hasenlochs gehen. (Wie Caching Daten auf dem Client, Hintergrundaufgaben & amp; GCD, etc ...) Zeigen Sie nur, wie Sie die Grundlagen verkabeln - aber Sie werden definitiv lernen wollen, wie Sie AFNetworking für eine Hintergrundaufgabe verwenden, schauen Sie in Core Daten oder NSCoding für das Caching, und ein paar andere Themen, um solche Dinge richtig zu machen.

Es genügt zu sagen, dass in einer richtigen Lösung:
  - Sie möchten Ihren Web-Service nicht synchron aufrufen   - Sie möchten nicht jedes Mal die gleichen Daten erneut anfordern - dh den gleichen Datensatz nicht erneut aus dem Service herunterladen, wenn er nicht geändert wurde   - Ich zeige nicht, wie ich diese Dinge hier machen soll, weil es den Rahmen sprengt; Sehen Sie sich die Buchempfehlung unten sowie diesen Link an, um sich eine Vorstellung von diesen Themen zu machen. Ray Wenderlich - Core Data mit einem Web-Service synchronisieren

Für Ihren Datendienstcode würde ich eine "Speicher" -Klasse erstellen. (Tun Sie sich selbst einen Gefallen und holen Sie sich das Buch "Big Nerd Ranch iOS", wenn Sie es noch nicht haben.
iOS Programming 4th Ausgabe

Nehmen Sie den folgenden Code mit einem Körnchen Salz - aus Gründen, auf die ich nicht eingehen kann, kann ich das nicht von meinem Mac aus (auf einem Win-Rechner) und auch nicht kopieren oder mailen Sie mir selbst den Code ... also mache ich alles im StackOverflow-Editor ...

Mein iTunesStore-Vertrag (Header-Datei) sieht ungefähr so ​​aus:

%Vor%

... und die Implementierung würde ungefähr so ​​aussehen:

%Vor%

Ich habe jetzt ein "Speicher" -Objekt Singleton, das ich verwenden kann, um Datensätze zu erhalten, gebe einen bestimmten Datensatz zurück und teilt mir auch eine Anzahl von Datensätzen mit. Jetzt kann ich einen Großteil der Logik vom Viewcontroller aus verschieben.

Jetzt muss ich das in Ihrer VC viewDidLoad Methode nicht mehr machen. Im Idealfall würden Sie eine asynchrone Methode in Ihrem Speicherobjekt verwenden, um Datensätze zu erhalten, und einen Block, um Sie zurückzurufen, sobald die Datensätze geladen sind. Innerhalb des Blocks laden Sie Datensätze neu. Die Signatur für so etwas könnte "aussehen":

%Vor%

Ihre View Controller-Datenquellenmethoden sehen jetzt wie folgt aus:

%Vor%

Innerhalb von cellForRowAtIndexPath - Ich rufe auch mein Speicherobjekt auf, um den richtigen Datensatz zu erhalten

%Vor%

Das ist der Kern davon. Andere Dinge zu tun, wie oben erwähnt, wäre:

  • Lassen Sie ITunesStore UITableViewDataSource implementieren und behandeln Sie dann direkt die tableview-Datenquellenmethoden. Wenn Sie dies tun, möchten Sie iTunesStore nicht zu einem Singleton machen. Außerdem würden Sie statt des View-Controllers eine Instanz von iTunesStore als Delegat des TableViews festlegen. Es gibt Vor- und Nachteile eines solchen Ansatzes.
  • Ich habe kein echtes asynchrones Verhalten oder Caching gezeigt, nach dem diese App
  • ruft
  • Dies zeigt, wie Sie einige Ihrer Modellverantwortlichkeiten abwickeln und einige Bedenken bezüglich der Datenquellen in der tabellarischen Ansicht lösen können.

Hoffentlich hilft das, Ihnen einige Ideen über verschiedene Richtungen zu geben, die Sie erkunden könnten.  Glückliche Kodierung!

    
Bladebunny 21.10.2013, 02:15
quelle
1

In Bezug auf UITableViewController werden normalerweise alle Rollen Model, View und Controller (MVC) von Ihrem UITableViewController selbst abgespielt. Das ist auch bei deinem Code der Fall.

  1. Als Modell - Es liefert Daten zu Ihrer Tabellenansicht.
  2. Als Controller - Steuert das Erscheinungsbild der Tabelle wie Anzahl der Zeilen, Abschnitte, Höhe und Breite usw., liefert Daten vom Modell zur Tabellenansicht
  3. Als Ansicht - Seine Ansichtseigenschaft enthält das UITableView

Um nun einen anderen Ansatz zu wählen, könnte Model von Ihrer Controller-Klasse getrennt werden. Dafür haben Sie eine Unterklasse von NSObject und lassen Sie ihren Status setzen, der von Controller verwendet werden könnte.

Hoffen Sie, dass das für Sie Sinn macht.

    
Abhinav 21.10.2013 03:03
quelle