2017-04-13 8 views
4

Wie erstellt man gutes Routing im Projekt auf Viper-Architektur? Ich beginne Create-Datei für das Routing, aber ich verstehe nicht, was ich als nächstes tun muss.Routing Viper-Architektur

erstelle ich eine Datei Drahtgitter- erste Controller und Drahtmodell-Protokoll:

// ChooseLanguageWireframeProtocol.swift 

import UIKit 

@objc protocol ChooseLanguageWireframeProtocol { 
    func presentChooseLanguageViewControllerWindow() 
    func presentAuthScreenViewController() 
} 

in Datei Drahtgitter- ich hinzufügen:

// ChooseLanguageWireframe.swift 

import UIKit 

class ChooseLanguageWireframe: NSObject , ChooseLanguageWireframeProtocol{ 

    var chooseLanguageScreenViewController: ChooseLanguageViewController? 
    var window: UIWindow? 

    func presentChooseLanguageViewControllerWindow() { 
     let chooseLanguageViewController = UIStoryboard.init(name: "ChooseLanguage", bundle: nil).instantiateViewController(withIdentifier: "ChooseLanguage") as? ChooseLanguageViewController 
     self.chooseLanguageScreenViewController = chooseLanguageViewController 
     self.window!.rootViewController = chooseLanguageScreenViewController 
     self.window!.makeKeyAndVisible() 
    } 
    func presentAuthScreenViewController() { 

    } 
} 

Nachdem ich RootWireframe erstellen

// RootWireframe.swift 

import UIKit 

class RootWireframe: NSObject { 

    let chooseLanguageScreenWireframe : ChooseLanguageWireframe? 

    override init() { 
    //What i must init?? 
    } 

    func application(didFinishLaunchingWithOptions launchOptions: [AnyHashable: Any]?, window: UIWindow) -> Bool { 
     self.chooseLanguageScreenWireframe?.window = window 
     return true 
    } 

} 

In Datei AppDelegate i nur ändern

var window: UIWindow? 
    let rootWireframe = RootWireframe() 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     self.rootWireframe.application(didFinishLaunchingWithOptions: launchOptions as [NSObject : AnyObject]?, window: self.window!) 
    } 

Was muss ich hinzufügen oder ändern, um richtig zu arbeiten?

+1

Sie fehlen eigentlich nur die Erstellung und Injektion der Abhängigkeiten. Viper und alle anderen entkoppelten Architekturen basieren alle auf der Abhängigkeitsinjektion und der Erfindung der Steuerung. –

Antwort

0

2 Möglichkeiten:

Ändern Sie den init Ihrer rootViewframe Ihre Abhängigkeit zu akzeptieren und initialisieren. Und btw Ihr Variablentyp sollte nicht die reale Art sein, aber das Protokoll, so dass Sie es leicht in Tests

let chooseLanguageScreenWireframe : ChooseLanguageWireframeProtocol? 

override init(chooseLanguage: ChooseLanguageWireframeProtocol) { 
self.chooseLanguageScreenWireframe = chooseLanguage 
} 

Mock und dann chooseLanguageWireframe Implementierung in der AppDelegate erstellen und es in dem Konstruktor übergeben. Dies macht die Abhängigkeit klar und sichtbar. Sie können die Option auch entfernen, da Sie sie immer initialisieren.

Oder Lösung 2 die chooseLanguageWireframe im AppDelegate erstellen und dort

lazy var rootWireframe = { 
let r = RootWireframe() 
r.chooseLanguageScreenWireframe = self.chooseLanguageScreenWireframe 
return r 
} 

In jedem Fall außerhalb Konstruktor injizieren, müssen Sie Ihre Abhängigkeiten irgendwo instanziiert, können sie nicht automatisch erstellt bekommen. Normalerweise tun Sie das mit Fabriken und mit Hilfe einer Abhängigkeitsinjektion Rahmen (überprüfen Sie SwiftInject oder Typhoon)

Auch alle Ihre Abhängigkeiten mit Protokollen Typ zu deklarieren, ist es der Zweck der VIPER-Architektur zu vereinfachen Tests und Mocking mit Isolationen zwischen Akteuren

1

Eine Möglichkeit ist es, von UINavigationController zu erben und die Routing-Logik dort zu tun. Es kann sein, dass mehrere Klassen in Abhängigkeit von Ihrer Aufgabe Routing in verschiedenen Teilen Ihrer Anwendung durchführen.

Aber wie mit jedem cromulent Buzzword müssen Sie sich zuerst fragen , wenn die "Lösung" mehr Probleme löst als es schafft.

Es beginnt Sinn zu machen, wenn Sie zwei Dutzend Bildschirme und beginnen in das gleiche Problem verirren, die durch Zugabe von Storyboards plain old xibs vor Ewigkeiten beschlossen wurde.

Also muss man sich wirklich zurück und fragen Schritt, wenn Sie wirklich diese cromulent Architektur sehr viele Klassen in dem Prozess folgen wollen Erstellen ein Labyrinth, das kaum mehr lesbar ist als ein Standard-MVC-Projekt sein wird.

Wenn Sie nicht Storyboards verwenden können und wollen VIPER verwenden, tun dies, wenn Sie Storyboards tun VIPE :-)

Aber in den meisten Projekten die Datenmodell ist so rührend einfach und die Präsentation ist so dicht verwenden können gekoppelt, dass Sie Null in UIViewController defattening haben.

Und ich vermute, dass die Heilung durch die meisten Viper affictionados schlimmer als das Sterben selbst ist.

+1

Cocoa MVC ist sehr stark gekoppelt. Es gibt keine Möglichkeit, Ihre Geschäftslogik usw. zu testen, indem Sie ein Framework wie Viper verwenden, das Tests und Wartbarkeit für das Projekt für Sie und alle zukünftigen Entwickler ermöglicht. Selbst für kleine Projekte kann es gut sein, es anzuwenden, weil man nie weiß, wie groß ein Projekt werden kann und wie man Dinge macht, die in einem anderen größeren Projekt nützlich sein können. Architektur ist mehr eine Denkweise als die Art, wie Sie sie programmieren –