Verwendung von MVVM in iOS

Ich bin ein iOS-Entwickler, und ich bin schuldig Massive View-Controller in meinen Projekten so, ich habe die Suche nach einem besseren Weg, um Struktur meiner Projekte und bin auf das MVVM (Model-View-ViewModel-Architektur. Ich habe schon viel gelesen von MVVM mit iOS, und ich habe ein paar Fragen. Ich werde erklären, meine Fragen mit einem Beispiel.

Ich habe einen view-controller genannt LoginViewController.

LoginViewController.swift

import UIKit

class LoginViewController: UIViewController {

    @IBOutlet private var usernameTextField: UITextField!
    @IBOutlet private var passwordTextField: UITextField!

    private let loginViewModel = LoginViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func loginButtonPressed(sender: UIButton) {
        loginViewModel.login()
    }
}

Es nicht über eine Model-Klasse. Aber ich habe eine Ansicht erstellen, Modell namens LoginViewModel um die Validierungs-Logik und Netzwerk-Aufrufe.

LoginViewModel.swift

import Foundation

class LoginViewModel {

    var username: String?
    var password: String?

    init(username: String? = nil, password: String? = nil) {
        self.username = username
        self.password = password
    }

    func validate() {
        if username == nil || password == nil {
            //Show the user an alert with the error
        }
    }

    func login() {
        //Call the login() method in ApiHandler
        let api = ApiHandler()
        api.login(username!, password: password!, success: { (data) -> Void in
            //Go to the next view controller
        }) { (error) -> Void in
            //Show the user an alert with the error
        }
    }
}
  1. Meine erste Frage ist einfach ist mein MVVM Implementierung korrekt? Ich habe diese Zweifel, weil zum Beispiel ich die login-Schaltfläche Tippen Sie auf ein Ereignis (loginButtonPressed) in den controller. Ich wusste nicht, erstellen Sie eine separate Ansicht für den login-Bildschirm, weil es hat nur ein paar Textfeldern und einem button. Ist es akzeptabel für den controller zu haben, der Ereignis-Methoden gebunden zu UI-Elementen?

  2. Meine nächste Frage ist auch über den login-button. Wenn der Benutzer auf die Schaltfläche, die die Werte username und password sollten gte ging in die LoginViewModel für die Validierung und wenn erfolgreich, dann kann der API-Aufruf. Meine Frage, wie übergeben Sie die Werte an den view-Modell. Sollte ich zwei Parameter Hinzugefügt, um die login() - Methode auf und übergeben Sie, wenn ich rufen Sie es von der view-controller? Oder soll ich erklären Eigenschaften in der Ansicht Modell und legen Sie deren Werte aus der view controller? Welche akzeptabel ist in MVVM?

  3. Nehmen die validate() Methode im view-model. Die Nutzer sollten benachrichtigt werden, wenn Sie leer sind. Das bedeutet, dass nach der überprüfung, das Ergebnis zurückgegeben werden soll, um den view-controller auf, die notwendigen Maßnahmen (anzeigen einer Meldung). Gleiche Sache mit den login() Methode. Den Nutzer warnen, wenn die Anforderung fehlschlägt oder gehen Sie zum nächsten view-controller, wenn es gelingt. Wie kann ich benachrichtigt den controller der diese Ereignisse aus der view-Modell? Ist es möglich, verbindliche Mechanismen wie der KVO in Fällen wie diesem?

  4. Was sind die anderen bindungsmechanismen bei der Verwendung von MVVM für iOS? KVO ist eine. Aber ich lese es nicht ganz geeignet für größere Projekte, weil es erfordert eine Menge boilerplate code (registrieren/deregistrieren Beobachter etc). Was sind andere Optionen? Ich weiß ReactiveCocoa ist ein framework, das verwendet wird für das, aber ich bin auf der Suche, um zu sehen, ob es irgendwelche anderen einheimischen.

Alle Materialien stieß ich auf MVVM im Internet wenig bis keine Informationen über diese Teile bin ich auf der Suche, um zu klären, also ich würde wirklich zu schätzen Ihre Antworten.

  • Ist das nur bei mir oder jemand anderem nicht wie Netzwerk-Anforderungen, die von einem view-Modell zu?
  • Ich Stimme zu, es ist am besten Praxis nicht zu machen, Netzwerk-Aufrufe in der Sicht-Modell, aber in dem Beispiel die ApiHandler Klasse erfolgreich abstrahiert die Besonderheiten auf, wie eine Anmeldung durchgeführt wird. Es ist nur eine Vermutung an dieser Stelle, dass es in der Tat eine Netzwerk-Anruf stattfindet. Die app könnte offline sein und die Anmeldung über eine lokale db. Wir wissen nicht und auch nicht das view-Modell (das ist, wie es sein sollte). Es wäre besser, wenn der Datentyp für die api-variable wurde ein Protokoll, das implementiert wurde, durch ApiHandler.
InformationsquelleAutor Isuru | 2014-11-28
Schreibe einen Kommentar