MVVM:AppDelegate的“ViewModel”

时间:2015-12-09 17:25:58

标签: ios swift mvvm swift2 swift2.1

My Swift项目使用MVVM,我想知道为我的AppDelegate提供“ViewModel”的方法是什么,所有其他ViewControllers都可以访问它。据我所知,如果在整个应用程序中严格遵循MVVM模型,AppDelegate实际上并不是一个拥有自己的ViewModel的ViewController。

我想在我的整个应用程序中拥有一个状态,用于用户注销,下载内容等等。也许有一天“ViewModel”会有更多用途。

我是否应该拥有这些状态的全局变量,或者我可以让AppDelegate拥有viewModel属性,然后让我的ViewControllers访问它?对于我来说,全局对象不是常量(这只是我的感觉),这似乎“不太干净”。

我也在使用ReactiveCocoa 4,如果有任何帮助的话。

2 个答案:

答案 0 :(得分:1)

虽然允许AppDelegate成为一个捕获所有是一个常见的陷阱,以避免我不认为AppDelegate的ViewModel是最好的解决方案。另一种解决方案是使用可以存储应用程序登录状态的单例来创建“管理器”类(或结构)。这样,您的登录状态就可以被应用程序的其余部分访问,而不会给AppDelegate添加混乱。

答案 1 :(得分:0)

依赖注入是最好的方法,您可以拥有一个管理App路由的类,并将共享对象传递给层次结构。

class ApplicationNavigator {
   let loginManager = LoginManager()

   init(window: UIWindow) {
       let exampleViewModel = ExampleViewModel()
       let exampleViewController = ExampleViewController(loginManager: LoginManager, viewModel: exampleViewModel)

       let navigationController = UINavigationController(rootViewController: exampleViewController)
       window.rootViewController = navigationController
       window.makeKeyAndVisible()
   }
}

然后在AppDelegate的didFinishLaunchingWithOptions

var navigator: ApplicationNavigator?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    navigator = ApplicationNavigator(window: window!)
    return true
}