My Swift项目使用MVVM,我想知道为我的AppDelegate提供“ViewModel”的方法是什么,所有其他ViewControllers都可以访问它。据我所知,如果在整个应用程序中严格遵循MVVM模型,AppDelegate实际上并不是一个拥有自己的ViewModel的ViewController。
我想在我的整个应用程序中拥有一个状态,用于用户注销,下载内容等等。也许有一天“ViewModel”会有更多用途。
我是否应该拥有这些状态的全局变量,或者我可以让AppDelegate拥有viewModel
属性,然后让我的ViewControllers访问它?对于我来说,全局对象不是常量(这只是我的感觉),这似乎“不太干净”。
我也在使用ReactiveCocoa 4,如果有任何帮助的话。
答案 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
}