Skip to content

Latest commit

 

History

History
37 lines (29 loc) · 1.06 KB

use-lazy-actions.md

File metadata and controls

37 lines (29 loc) · 1.06 KB

Use lazy actions

Rationale

TODO

Example

final class LoginViewModel {

  public let email = MutableProperty("")
  public let password = MutableProperty("")

  private let _credentialsAreValid: AnyProperty<Bool>
  private lazy var logIn: Action<AnyObject, User, SessionServiceError> = {
    return Action(enabledIf: self._credentialsAreValid) { [unowned self] _ in
      if let email = Email(raw: self.email.value) {
        let password = self.password.value
        return self._sessionService.logIn(email,password).observeOn(UIScheduler())
      } else {
        return SignalProducer(error: .InvalidCredentials(.None))
      }
    }
  }()

  init(sessionService: SessionService, credentialsValidator: LoginCredentialsValidator = LoginCredentialsValidator()) {
    let isValidEmail = email.signal.map { validateEmail($0) }
    let isValidPassword = password.signal.map { validatePassword($0) }
    _credentialsAreValid = AnyProperty(
      initialValue: false,
      signal: combineLatest(isValidEmail, isValidPassword).map { $0 && $1 }
    )    
  }

}