2012-04-15 8 views
6

Ich bin neu in der iOS-Entwicklung, daher würde ich mich über Feedback freuen.Kommunikation zwischen Modell und Controller - iOS

Ich versuche, einen iOS-Client für meinen Webdienst zu erstellen. Soweit habe ich das gemacht:

Ich implementiere zwei Ansichten (Utility-basierte App mit Storyboard). In der Hauptansicht verwende ich ein Textfeld und eine Suchschaltfläche, wo der Benutzer eine Abfrage eingeben und dann auf die Suchschaltfläche klicken kann. Sobald der Suchknopf angeklickt ist, möchte ich den Wert des Textfelds lesen und in meinem Restful-Anruf für meinen Web-Service verwenden. Mein Webdienst antwortet mit einer JSON-Datei mit den Abfrageergebnissen, die ich parsen und dem Textbereich der sekundären Ansicht anzeigen kann.

Ich weiß, wie man den erholsamen Aufruf in iOS macht und wie man das JSON-Parsing macht und die Ergebnisse auf dem Bildschirm anzeigt (zumindest das Textkram, aber das ist eine andere Frage). Aber meine Absicht ist es, MVC Grundlagen zu meiner Anwendung zu lernen und zu implementieren.

Gemäß MVC aktualisiert der Controller die Ansicht, und das Modell sendet eine Benachrichtigungssendung, die der Controller abhören kann und weiß, ob Änderungen am Objekt vorliegen. Das würde ich am liebsten tun:

Mein Modell - Mein Modell würde den REST-Kern-Aufruf verarbeiten, die JSON-Antwort abrufen, analysieren und die resultierenden Werte abrufen, die ich in der Ansicht anzeigen möchte.

Mein Controller - Ich möchte, dass mein Controller auf mein Modell hört und die resultierenden Werte von Model abruft und sie in View anzeigt.

Mit einem schnellen und schmutzigen Weg kann ich den REST-Aufruf implementieren, JSON Parsing und Anzeige der resultierenden Werte - alle innerhalb des Controllers, aber mit dieser Technik, wenn meine Ansicht morgen ändert, dann muss ich meinen Code neu schreiben . Oder wenn ich neue Funktionen hinzufügen möchte, muss ich meinen Controller ändern. Idealerweise würde ich gerne ein Kernmodell haben, das nicht weiß, wie View aussieht, und lässt den Controller die Ergebnisse von Model übernehmen und sie in View anzeigen.

Von dem, was ich bisher aus den Google-Suchergebnissen gelesen habe, gibt es zwei Möglichkeiten: a) Schlüsselwertbeobachtung und b) Benachrichtigungszentrum.

In den letzten 2 Tagen versuche ich einen guten, vernünftigen Weg zu finden, Notification Center zu implementieren oder mehr darüber zu lesen, ich bekomme keinen guten Vorsprung. Einige der Fragen, die ich habe, ist, kann ich den String-Ergebnisse Wert senden mit Hilfe der Benachrichtigungszentrale, die mein Controller abholt? Wie funktioniert Notification Center wirklich mit String-Werten? Wo finde ich einige gute Beispiele?

Also jede Hilfe in diesem Zusammenhang wird sehr geschätzt werden.

+1

Sie möchten wirklich, dass Ihr MODEL die Kommunikation mit dem RESTful-Service übernimmt? – Till

Antwort

12

Einige der Fragen, die ich habe, kann ich die String Wert mit Notification Center Ergebnisse aussenden, dass mein Controller aufgreift?

Ja, das wäre mit der userInfo Eigenschaft eines NSNotification häufig getan. userInfo ist eine einfache NSDictionary, die Instanzen von NSObject abgeleiteten Objekten enthalten kann, die von Schlüsseln indiziert werden, die dem NSCopying-Protokoll folgen (normalerweise wird NSString verwendet). Beachten Sie, dass das Wörterbuch (userInfo) Ihr Parameterobjekt/s enthält.


Wie funktioniert wirklich Notification Center mit String-Werten arbeiten?

Nun, das hängt davon ab, wie Sie wollen, dass es funktioniert. Aber pingel beiseite, siehe unten.


Wo finde ich einige gute Beispiele finden?

Vielleicht hilft man ...


Beispiel

Der Empfänger (Controller) für die Benachrichtigung registriert:

- (void)registerForNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(modelObjectUpdatedString:) 
               name:@"StringUpdated" 
               object:nil]; 
} 

Der Sender (Modell) benachrichtigt die Welt:

Der Empfänger (Controller) erhält die Benachrichtigung in seinem Handler:

- (void)modelObjectUpdatedString:(NSNotification *)notification 
{ 
    ModelObject *postingObject = [notification object]; 
    NSString *string = [[notification userInfo] 
     objectForKey:@"String"]; 
    ... 
} 
+2

Dies ist eine perfekte Antwort. Vielen Dank für eine klare und prägnante Antwort. Genau das habe ich gesucht. – BlueChips23

4

Sie sind auf dem richtigen Weg zu denken, aber immer noch nicht ganz. Wie Till in seinem Kommentar "hervorhebt", sollten Sie die REST-konforme Kommunikation in Ihrem Modell nicht behandeln. Wenn ich Sie wäre, würde ich eine Dienstprogrammklasse erstellen, die für das Abrufen der Informationen zuständig ist, und dann eine Klasse, die für das Halten der Daten zuständig ist (diese letzte Klasse ist Ihr Modell).

Es wäre klug, eine Klassenmethode zu erstellen, die eine neue Instanz dieses Objekts zuweist und initiiert, die aus den JSON-Daten erstellt wurde, die über Ihre REST-konforme Communicator-Klasse abgerufen wurden.

Von Ihrem Controller Sicht:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL]; 
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]]; 
// Present your models data in the view. 

Sie verwenden Coredata hier profitieren können, und ich Sie stark in das aussehen fördern.

+0

Gute Tipps hier. Danke, dass du mich in die richtige Richtung gelenkt hast. Dies sind die Arten von Feedback, die ich mir erhofft hatte, da ich neu in der iOS-Entwicklung bin und die Grundlagen richtig machen will, bevor ich irgendwelche komplizierten Apps mache. – BlueChips23

+0

Sie sollten NSNotificationCenter nicht verwenden, es sei denn, Sie haben einen Fall, in dem Blöcke, KVO oder Delegation den Job nicht ausführen können. –

+0

Hi Rasmus, ich komme auch mit IOS in Berührung. (Nicht so neu für OO). Würden Sie dann vorschlagen, dass die restHelper-Klasse zu einem Protokoll auf dem Modell "zurückruft", sobald es einige Daten hat? Und könnten Sie erklären, warum Sie [rest fetchObjectWithID: 1] verwenden? Ich weiß, dass ich in den Stanford-Videos darüber gestolpert bin, aber anscheinend habe ich diese Gehirnzellen zerstört ... – Greycon