2017-10-25 1 views
6

Derzeit entwickle ich eine iOS-Anwendung mit MVVMC-Architektur. Ich habe eine Idee über MVVMC bekommen, indem ich diese article gelesen habe. Als typisches MVVM-Modell wissen wir, dass alle wichtigen App-Controller wie Web-Service-Aufrufe die ViewModel-Klasse aufrufen sollten. Aber in der MVVMC-Architektur können wir entweder Koordinator oder ViewModel verwenden, um Web-Services aufzurufen. Ich konnte nicht herausfinden, wo der beste Platz dafür ist.Was ist der beste Ort, um Web-Services in iOS-Anwendungen mit MVVMC-Architektur aufzurufen?

Ich versuche derzeit, Benutzerliste Seite der Anwendung mit UITableViewController zu implementieren. Im Folgenden sind einige Teile meiner UserCoordinator- und UserViewModel-Klassen aufgeführt.


UserCoordinator

class UsersCoordinator: Coordinator { 

var window: UIWindow 
weak var delegate: UsersCoordinatorDelegate? 

var selectedCity: City? 

init(window: UIWindow) { 
    self.window = window 
} 

func start() { 
    let storyboard = UIStoryboard(name: "Users", bundle: nil) 
    if let vc = storyboard.instantiateViewController(withIdentifier: "list") as? UsersListController { 
     var viewModel = UsersListViewModel() 
     viewModel.delegate = self as UsersListViewModelDelegate 
     viewModel.veiwController = vc 
     vc.viewModel = viewModel 
     vc.coordinationDelegate = self as CoordinationDelegate 
     let nav = UINavigationController.init(rootViewController: vc) 
     window.rootViewController = nav 
    } 

} 

UserViewModel

protocol UsersListViewModelDelegate: class { 
    func selectUser(viewController: UIViewController, city: City) 
} 

struct UsersListViewModel { 
    var delegate: UsersListViewModelDelegate? 
    weak var veiwController: UsersListController! 
    var source = [String]() 

    init() { 
     for user in users { 
      source.append(user.name) 
     } 
    } 

    func selectRow(row: NSInteger) { 
     delegate?.selectUser(viewController: veiwController, user: users[row]) 
    } 

    fileprivate var users: [User] { 
     get { 
      //web service call?? 
     } 

Wo soll ich den Web-Service hier nennen? Wie ich theoretisch gelesen habe, ist Coordinator der dedizierte Ort für Application Routing. Daher ist es besser, Web-Services in ViewModel aufzurufen. Aber ich denke, es ist besser, Web-Services im Coordinator aufzurufen, weil sie Daten sehr schnell laden und das viewModel füllen. Was soll ich machen?

Antwort

1

Wenn es um Architektur geht, gibt es keine Wunderwaffe. In diesem Sinne ist MVVM-C eines der saubersten, leicht zu testenden und modularen Muster, also ist es großartig, dass Sie damit fortfahren.

Sie können die Architektur an Ihre Anforderungen anpassen. In Anbetracht Ihrer aktuellen Design denke ich, es wäre am besten, eine Service-Klasse zu erstellen, nennen Sie es WebService. Diese Klasse führt Netzwerkaktivitäten unter der Aufsicht des Koordinators durch. Der Koordinator wird

  1. Init WebService
  2. Netzwerk Führen Sie ruft
  3. Init das Ansichtsmodell mit den abgerufenen Daten (oder das Ansichtsmodell anweisen, ein ausgefallenes Netzanruf zu handhaben)
+0

Ja. Ich habe bereits eine Serviceklasse erstellt und gesucht, wo diese Methoden aufgerufen werden können. Wie du gesagt hast fühle ich mich auch im Koordinator besser aufgehoben. Vielen Dank. – TharinduKetipe

1

Als ich durch die recherchierten Internet gibt es keine Konvention, wo Sie Ihre Webdienste aufrufen können. Es hängt vollständig von Ihrer Projektumsetzung ab. Entweder Sie können sie in Ihrer Coordinator- oder ViewModel-Klasse aufrufen. Da wir Coordinator verwenden

  1. Viewcontroller
  2. Ansichtsmodell

Innerhalb des Koordinators Klasse zu initialisieren, wie ich oben geschrieben habe. Wir können dieselbe start() -Funktion verwenden, um die Webdienste wie folgt aufzurufen.

func start() { 
    let storyboard = UIStoryboard(name: "Users", bundle: nil) 
    if let vc = storyboard.instantiateViewController(withIdentifier: "list") as? UsersListController { 
     let uDs = UserDataService(pClient:APIClient()) 
     uDs.getUserDetails { (response, status) in 
      if (status == APIClient.APIResponseStatus.Success) { 
       if let resArrray = response as? [User] { 
        var viewModel = UsersListViewModel.init(userList: resArrray) 
        viewModel.delegate = self as UsersListViewModelDelegate 
        viewModel.veiwController = vc 
        vc.viewModel = viewModel 
        vc.coordinationDelegate = self as CoordinationDelegate 
        let nav = UINavigationController.init(rootViewController: vc) 
        self.window.rootViewController = nav 
       } 
      } else { 
       //error alert 
      } 
     } 
    } 
} 

Es ist besser, Web-Service-Aufrufe innerhalb der Coordinator-Klasse aufzurufen. Denn nach dem Aufruf des Web-Service entsprechend der Antwort können wir die Ansichtsnavigation steuern. Wenn die Antwort zum Erfolg führt, können wir eine ViewController-Klasse erstellen und sie laden. Sonst könnten wir ein Fehler-Popup laden.In der Zwischenzeit konnten wir uns genügend Zeit für den Webservice-Aufruf nehmen und diese Daten in das viewModel füllen.

Basierend auf dem, was ich über das Internet gefunden habe, habe ich ein Beispielprojekt mit MVVM-C-Architektur implementiert. Ich habe es in GitHub gehostet. Sie können es in here finden.

dieses poroject von beziehe man eine klare Vorstellung darüber haben, wie Ansicht Navigations mit MVVM-C-Muster zu implementieren, wie Web-Services aufzurufen, wie aus Daten Viewmodels aufzufüllen usw.

Verwandte Themen