2017-10-25 65 views
6

Obecnie pracuję nad aplikacją na iOS przy użyciu architektury MVVMC. Dowiedziałem się o MVVMC czytając ten article. Jako typowy model MVVM wiemy, że wszystkie główne kontrolery aplikacji, takie jak usługi sieciowe, powinny wywoływać w klasie ViewModel. Ale w architekturze MVVMC możemy użyć albo Koordynatora, albo ViewModel, aby połączyć się z usługami sieciowymi. Nie mogłem ustalić, co jest najlepszym miejscem na to.Jakie jest najlepsze miejsce do wywoływania usług sieciowych w aplikacji iOS z architekturą MVVMC?

Próbuję obecnie zaimplementować stronę listy użytkowników aplikacji za pomocą UITableViewController. Oto niektóre części moich klas UserCoordinator i UserViewModel.


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?? 
     } 

Gdzie należy wezwać serwis internetowy tutaj? Jak czytałem teoretycznie, koordynator jest dedykowanym miejscem do routingu aplikacji. Więc zgodnie z tym lepiej jest połączyć się z usługami sieciowymi w ViewModel. Ale uważam, że lepiej jest wywoływać usługi sieciowe w koordynatorze, ponieważ bardzo szybko załaduje dane i zapełni viewModel. Co powinienem zrobić?

Odpowiedz

1

Jeśli chodzi o architekturę, nie ma srebrnej kuli. Mając to na uwadze, MVVM-C jest jednym z najczystszych, łatwych do przetestowania i modularnych wzorów, więc wspaniale jest, że robisz to z wyprzedzeniem.

Możesz dowolnie dostosować architekturę do własnych wymagań. Powiedziawszy to, biorąc pod uwagę twój obecny projekt, myślę, że najlepiej byłoby stworzyć klasę usług, nazwij to WebService. Ta klasa będzie wykonywać operacje sieciowe pod nadzorem koordynatora. Koordynator będzie

  1. Init WebService
  2. wykonać sieć nazywa
  3. Init viewmodel z danymi idących (lub zlecić ViewModel obsłużyć nieudane połączenia sieciowego)
+0

Tak. Stworzyłem już klasę usług, szukając gdzie wywołać te metody. Jak już powiedziałeś, czuję się lepiej, gdy powołuję się na koordynatora. Dziękuję Ci bardzo. – TharinduKetipe

1

Jak zbadane poprzez internet nie ma konwencji gdzie można wywoływać twoje usługi sieciowe. To całkowicie zależy od realizacji projektu. Możesz je wywołać na swojej klasie Coordinator lub ViewModel. Ponieważ używamy koordynatora zainicjować

  1. ViewController
  2. ViewModel

Wewnątrz klasy Koordynator jak napisali powyżej. Możemy użyć tej samej funkcji start(), aby wywołać usługi sieciowe w następujący sposób.

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 
      } 
     } 
    } 
} 

Lepiej jest wywoływać wywołania usługi internetowej wewnątrz klasy Coordinator. Ponieważ po wywołaniu usługi internetowej zgodnie z odpowiedzią możemy kontrolować nawigację widoku. Tak jak w przypadku sukcesu, możemy stworzyć klasę ViewController i wczytać ją. W przeciwnym razie możemy załadować popup błędu.W międzyczasie mogliśmy poświęcić wystarczająco dużo czasu na wywołanie usługi sieciowej i zapełnić te dane w viewModelu.

Na podstawie tego, co znalazłem przez Internet, zaimplementowałem przykładowy projekt wykorzystujący architekturę MVVM-C. Prowadziłem go w GitHub. Możesz go znaleźć w here.

Przez odnosząc tę ​​poroject można mieć jasne wyobrażenie o tym, jak wdrożyć zobacz nawigacje użyciu MVVM-C wzór, Jak wywołać usług internetowych, jak wypełnić ViewModels z danych itp