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
gehtIch 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%Das ist eine ziemlich große Frage, die Sie stellen. Aber lassen Sie mich antworten, indem Sie es so einfach wie möglich machen.
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:
Hoffentlich hilft das, Ihnen einige Ideen über verschiedene Richtungen zu geben, die Sie erkunden könnten. Glückliche Kodierung!
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.
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.
Tags und Links objective-c uitableview ios model-view-controller