Skip to content

Instantly share code, notes, and snippets.

@AppsTitude
Last active May 3, 2019 13:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AppsTitude/b797aa002f092447519289e1e7c100a9 to your computer and use it in GitHub Desktop.
Save AppsTitude/b797aa002f092447519289e1e7c100a9 to your computer and use it in GitHub Desktop.
protocol ViewModelInputs {
var buttonTapped: AnyObserver<Void> { get }
}
protocol ViewModelOutputs {
var showLoginErrorMessage: Driver<String> { get }
}
protocol ViewModelIO {
var inputs: ViewModelInputs { get }
var outputs: ViewModelOutputs { get }
}
protocol ViewModelNavigation {
var loginSuccessful: Observable<User> { get }
}
final class ViewModel: ViewModelIO, ViewModelInputs, ViewModelOutputs, ViewModelNavigation {
// IO
var inputs: ViewModelInputs { return self }
var outputs: ViewModelOutputs { return self }
// Inputs
let buttonTapped: AnyObserver<Void>
// Outputs
let showLoginErrorMessage: Driver<String>
// Navigation
var navigation: ViewModelNavigation { return self }
let loginSuccessful: Observable<User>
init(api: LoginAPI) {
let buttonTappedSubject = PublishSubject<Void>()
self.buttonTapped = buttonTappedSubject.asObserver()
let result: Observable<Result<User, LoginError>> = buttonTappedSubject
.flatMapLatest { _ in return api.login() }
self.loginSuccessful = result.value
.unwrap()
self.showLoginErrorMessage = result.error
.unwrap()
.map("You didn't say the magic word!")
.asDriver(onErrorDriveWith: .empty())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment