Wann verändert sich das Model

  • Wann verändert sich das Model

    Huhu, mal ne Frage bezüglich des Models, nehmen wir mal an ich hab mein Model User als Objekt mit bestimmten Werten zB. username, userEmail usw. Nun mache ich es im Code ja so, sobald sich mein Model ändert, möchte ich gern dass mein View dies auch anzeigt, das funktioniert auch.

    Quellcode

    1. - (void)setUser:(User *)user
    2. {
    3. if (_user != user) {
    4. _user = user; // bissel Code
    5. }
    6. }



    Also wenn ich mich mit nem anderen User einlogge dann wird mein View dementsprechend upgedatet. Was ist aber, wenn ich jetzt sagen wir mal von meinem Model den username ändere im Controller.

    Quellcode

    1. [self.user setUsername:newUsername];


    dann gibt mir die obige if-Abfrage ein FALSE zurück. Nun die Frage, wie kann ich es lösen, dass ich ein TRUE bei der if-Abfrage zurückbekomme, weil sich ja der username vom Model geändert hat.

    mfg und Danke
    [window close]
  • uniique schrieb:


    Quellcode

    1. [self.user setUsername:newUsername];

    dann gibt mir die obige if-Abfrage ein FALSE zurück. Nun die Frage, wie kann ich es lösen, dass ich ein TRUE bei der if-Abfrage zurückbekomme, weil sich ja der username vom Model geändert hat.

    Naja, wenn du den Setter '-(void)setUsername: (String*)username' aufrust, ist das deinem Setter '-(void)setUser: (User*)user' ja vollkommen lachs.
    Der bekommt davon nix mit.

    Viel interessanter ist für mich die Frage: warum willst du das mitbekommen?
    Diese Setter-Methode scheint im Modell zu liegen. Du änderst doch hoffentlich dein View nicht aus deinem Modell heraus?

    Mal schnell ein fiktives Szenario zusammengetippt:

    C-Quellcode

    1. - (IBAction)changeUser: (id)sender
    2. {
    3. NSString* givenUsername = [usernameTextField text];
    4. NSString* givenPassword = [passwordTextField text];
    5. User* newUser = [userModel getUserWithName: givenUsername givenPassword];
    6. if(newUser != nil)
    7. {
    8. [userModel setCurrentUser:newUser];
    9. [rootViewController updateView:userInformationView];
    10. }
    11. }
    12. - (IBAction)changeUsername: (id)sender
    13. {
    14. NSString* givenUsername = [usernameTextField text];
    15. [[userModel currentUser] setUsername: givenUsername];
    16. [rootViewController updateView:userInformationView];
    17. /* Oder meinetwegen ne Nachricht UserdataDidChange
    18. * senden und in der dazugehörigen Methode alle Views,
    19. * die irgendwas mit dem Usernamen zu tun haben, anpassen.
    20. */
    21. }
    Alles anzeigen


    Nur: wenn dein Modell wirklich ein einziges Objekt ist, welchen Sinn hat das Ganze mit dem Wechsel dann?
    Wie auch immer: dein Controller weiß, dass er was geändert hat. Er kann also auch bitteschön dafür sorgen, dass dem View diese Informationen zugetragen werden. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • nein nein, ich habe ne Klasse User, wenn ich mich einlogge werden die Daten die ich zurückbekomme vom Server an die Klasse übergeben die bastelt mir nen User zusammen und gibt ihn mir als ein Objekt zurück, das ist mein Model. Dann nehm ich im Controller die Daten vom Model und lass sie halt im View anzeigen. Und wenn ich mich jetzt mit nem anderen User einlogge ändert sich ja mein Model, ich bekomme sozusagen dann andere Daten von meiner User Klasse zurück. Wie gesagt das funktioniert soweit perfekt. Nun habe ich in meinem Controller mein objekt User *user.

    Nun verändere ich aber im Controller zB. den username, muss ich dann also wieder das ganze an meine User Klasse schicken damit die mir ein neues User Objekt zurückgibt?

    Noch n Nachtrag zu meinem vorhergehenden Posting, meine Delegate Methode:

    Quellcode

    1. - (void)displayUser:(User *)user
    2. {
    3. [self setUser:user];
    4. [self.username setValue:self.user.username forKey:@"text"];
    5. [self.avatarImage setImage:self.user.userAvatar];
    6. }


    hier wird also der Setter aufgerufen. Und nachdem ich mein self.user setUsername:newUsername aufrufe, rufe ich ebenfalls wieder self displayUser:self.user auf. Aber ich denke mal das geht vielleicht noch besser per KVO nur soweit bin ich noch nicht.

    EDIT: nochwas, mein User Objekt wird im LoginController an den UserController per Delegate-Methode übergeben. Beide Controller haben in der Implementierung User *user. Somit erzeugt der UserController nicht sein eigenes User Objekt.
    EDIT2: achja und welchen Sinn das ganze hat, kann ich dir erklären, wenn ich das User Objekt zurückbekomme sind noch nicht alle Werte des User Objekts auf die richtigen Werte gesetzt, da ich diese zu dem Zeitpunkt der Objekterstellung noch nicht habe, welche ich dann aber im UserController setze. Das mit dem username war nur ein Beispiel.
    [window close]

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von uniique ()

  • war gerade bissel noch am überlegen wie ich das einfacher beschreiben kann, also mal angenommen, ich habe ne App, die sich Fotos von einem Server holt und diese in einem NSArray *photos speichert, welcher das Model darstellt. Nun kann diese App aber auch Fotos verändern.

    Quellcode

    1. [self.photos removeObjectAtIndex: 2];

    ist jetzt mein Array von vorher immer noch der gleiche auch wenn ein Foto gelöscht wurde wenn ich ihn per

    Quellcode

    1. if (_photos != photos)

    vergleiche?
    [window close]
  • Hmmm, warum wird es dann häufig gerade bei den Stanford Videos so gemacht? Oder habe ich da was falsch verstanden? Weil der Prof. da meint ja er schreibt sich seine eigene Setter-Methode fürs Model und vergleicht darin dann das Model.

    siehe hier

    EDIT: naja ich glaube er kann es so machen, da er davon ausgeht, dass er immer ein neues Model bekommt.
    [window close]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von uniique ()

  • Verstehe.
    Nee, also der von dir getätigte Vergleich bringt so nix.
    Du veränderst ja das Objekt von außen und setzt es nicht neu.

    Möglichkeit 1:

    C-Quellcode

    1. User *testuser = // Daten vom Server
    2. testuser.username = // Änderungen
    3. this.user = testuser


    Also den umgekehrten Weg gehen: nicht den User als Modell setzen und es bearbeiten sondern den Userl bearbeiten und ihn dann als Modell setzen.

    Möglichkeit 2:

    C-Quellcode

    1. this.user = // Daten vom Server
    2. this.user.username = // Änderungen
    3. [this.userView update];

    Dein Controller weiß, dass sich was geändert hat. Dann kann er das dem View doch auch einfach mitteilen.

    Den Einsatz von KVO verstehe ich in diesem Zusammenhang nicht.

    C-Quellcode

    1. this.user = // Daten vom Server
    2. this.user.username = // Änderungen
    3. /* hüpft zu dieser Methode in derselben Instanz des Controllers */
    4. - (void)monitoringNameDidChange:(NSNotification*)aNotif
    5. {
    6. [this.userView update];
    7. }

    Was ist denn daran jetzt besser?

    Die Jungs von Stanford tun andere Dinge als der durchschnittliche Entwickler, da kann es durchaus passieren, dass man da ins Straucheln kommt.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • naja ich bin kein durchschnittlicher Entwickler, eher ein Anfänger mit Potenzial :D ich habs so gemacht auf den Wert der sich verändert nen Observer gepackt, und sobald sich der Wert verändert wird ne Methode aufgerufen die nen TableView updated anhand des geänderten Wertes, wie gesagt das mit dem username war nur ein Beispiel

    ach und ähm, mit this meinst du doch bestimmt self ;)
    [window close]