2015-12-09 3 views
0

В моем проекте Swift используется MVVM, и мне интересно, какой способ иметь «ViewModel» для моего AppDelegate, к которому можно получить доступ ко всем другим ViewControllers. Я понимаю, что AppDelegate на самом деле не является ViewController, чтобы иметь свой собственный ViewModel, если строго следовать модели MVVM во всем приложении.MVVM: «ViewModel» для AppDelegate

Я хочу иметь состояние для всего своего приложения, когда пользователь выйдет из системы, загрузит что-то и т. Д. Возможно, когда-нибудь «ViewModel» будет иметь больше возможностей для использования.

Должен ли я иметь глобальные переменные для этих статусов или есть способ, которым я могу обладать свой AppDelegate с свойством viewModel, а затем позволить моим ViewControllers получить к нему доступ? Для меня просто кажется «менее чистым», когда у меня есть глобальные объекты, которые не являются константами (это только то, что я чувствую).

Я также использую ReactiveCocoa 4, если это поможет.

ответ

1

Несмотря на то, что AppDelegate является уловкой, все это обычная ошибка, чтобы избежать я не думаю, что ViewModel для AppDelegate - лучшее решение. Альтернативным решением было бы создать «менеджер» класс (или структуру) с помощью синглтона, который мог бы хранить состояние входа для приложения. Таким образом, ваше состояние входа будет доступно для остальной части приложения без добавления беспорядка в AppDelegate.

+0

Я ценю ваш ответ, и я подумал о синглтоне. Тем не менее, есть столько комментариев об одном синглете, которые просто заставляют меня избегать его использования ... http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons – ton

0

Наилучший подход - инъекция зависимостей, у вас может быть класс, который управляет маршрутизацией приложения и передает общие объекты по иерархии.

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 
}