2016-10-16 3 views
2

Ich möchte das Muster MVVM in meinem nächsten iOS-Projekt anwenden, und ich habe einige Beiträge und Blogs darüber gelesen. Aber die Beispiele, die sie zeigen, sind sehr einfache ohne Geschäftslogik, nur Datenmodell-Entitäten und View und Model Updates. Ich bin nicht klar, wer ist eigentlich verantwortlich für die Verwaltung der Geschäftslogik und Operationen: sollte es die ViewModel oder die Model sein?Übernahme von MVVM in iOS: ViewModel Verantwortlichkeiten?

Zum Beispiel, sagen wir mal, dass einer meiner Funktionen benötigt:

  • für einige Daten Fragen zu einem Webdienst
  • solche Daten Parse und wo es sich auf meine Datenmodell Entitäten
  • einige Perform checkings und Operationen auf solche Einheiten und Aktualisierung sowohl der View und die Model mit den Ergebnissen
  • einen Timer Griff, der einige weitere Updates und Operationen löst

Wie sollte ich diese Verantwortlichkeiten verteilen, um MVVM zu implementieren?

Antwort

-2

Lassen Sie uns sagen, dass es ein Web-Service, um Kommentare ist

Sie können CommentService erstellen, die Daten für das Herunterladen verantwortlich ist, Parsen und Initialisierung/Aktualisierungsmodell. Denn wir brauchen, um die Kommentare zu erhalten, so gibt es ein Verfahren

func getComments(_ completion:() -> [Comment]) 

CommentService.getComments von Ansichtsmodell in seiner Last-Methode aufgerufen wird.

class ViewModel { 
    private let commentService: CommentService 
    private var comments: [Comment] 
    ... 

func load() { 
    commentService.getComments() { [weak self] comments in 
     self?.comments = comments 
     //notify somehow the view..for example by using delegate 
    } 
} 
} 

Zum Beispiel wir die Kommentare zu downvote/upvote wollen, so können wir es blockiert

struct CommentService { 

    ... 

    func upvote(comment: Comment, completion: (Void) -> (Comment)) { 

    if comment.upvoted { 
     //throw error 
    } 
    //update via web service and update Comment's model by the response or just increment the comment.upvotes 
    //call completion with updated comment 
    } 
} 

struct ViewModel { 

    func upvoteComment(at index:Int, completion: (() ->())?) { 
     commentService.upvote(comments[index]) { updatedComment in 
      //do some more stuff with viewModel 
      completion?() //in the completion is implemented updating of ui 
     } 
    } 
} 

Die Fertigstellung implementieren Art und Weise bieten ui, ohne dass der Beauftragten oder Benachrichtigungen zu aktualisieren

Wenn der Timer die Methode auslöst, kann das Ende der Operation die Delegate-Methode aufrufen, um die Ansicht zu aktualisieren. Eine andere Option ist die Verwendung eines Bindungs-Frameworks (z. B. Bond). Dann kann View ViewModel-Eigenschaften beobachten und Delegate nicht benötigt werden.

https://github.com/thefuntasty/MVVMTestProject/tree/master/testMVVM Vielleicht kann dieses Projekt Ihnen helfen, zu verstehen.

Verwandte Themen