Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. //
  2. // GithubSignupViewModel2.swift
  3. // RxExample
  4. //
  5. // Created by Krunoslav Zaher on 12/6/15.
  6. // Modified by Chuck Krutsinger on 2/20/19.
  7. //
  8. // Copyright © 2015 Krunoslav Zaher. All rights reserved.
  9. //
  10.  
  11. import RxSwift
  12. import RxCocoa
  13.  
  14.  
  15. func githubSignupViewModel2(
  16. input: (
  17. username: Driver<String>,
  18. password: Driver<String>,
  19. repeatedPassword: Driver<String>,
  20. loginTaps: Signal<()>
  21. ),
  22. dependency: (
  23. API: GitHubAPI,
  24. validationService: GitHubValidationService,
  25. wireframe: Wireframe
  26. )
  27. )
  28. -> (
  29. validatedUsername: Driver<ValidationResult>,
  30. validatedPassword: Driver<ValidationResult>,
  31. validatedPasswordRepeated: Driver<ValidationResult>,
  32. signupEnabled: Driver<Bool>,
  33. signedIn: Driver<Bool>,
  34. signingIn: Driver<Bool>
  35. ) {
  36. let API = dependency.API
  37. let validationService = dependency.validationService
  38. let wireframe = dependency.wireframe
  39.  
  40. /**
  41. Notice how no subscribe call is being made.
  42. Everything is just a definition.
  43.  
  44. Pure transformation of input sequences to output sequences.
  45.  
  46. When using `Driver`, underlying observable sequence elements are shared because
  47. driver automagically adds "shareReplay(1)" under the hood.
  48.  
  49. .observeOn(MainScheduler.instance)
  50. .catchErrorJustReturn(.Failed(message: "Error contacting server"))
  51.  
  52. ... are squashed into single `.asDriver(onErrorJustReturn: .Failed(message: "Error contacting server"))`
  53. */
  54.  
  55. let validatedUsername = input.username
  56. .flatMapLatest { username in
  57. return validationService.validateUsername(username)
  58. .asDriver(onErrorJustReturn: .failed(message: "Error contacting server"))
  59. }
  60.  
  61. let validatedPassword = input.password
  62. .map { password in
  63. return validationService.validatePassword(password)
  64. }
  65.  
  66. let validatedPasswordRepeated = Driver.combineLatest(input.password, input.repeatedPassword, resultSelector: validationService.validateRepeatedPassword)
  67.  
  68. let signingInActivityIndicator = ActivityIndicator()
  69. let signingIn = signingInActivityIndicator.asDriver()
  70.  
  71. let usernameAndPassword = Driver.combineLatest(input.username, input.password) { (username: $0, password: $1) }
  72.  
  73. let signedIn = input.loginTaps.withLatestFrom(usernameAndPassword)
  74. .flatMapLatest { pair in
  75. return API.signup(pair.username, password: pair.password)
  76. .trackActivity(signingInActivityIndicator)
  77. .asDriver(onErrorJustReturn: false)
  78. }
  79. .flatMapLatest { loggedIn -> Driver<Bool> in
  80. let message = loggedIn ? "Mock: Signed in to GitHub." : "Mock: Sign in to GitHub failed"
  81. return wireframe.promptFor(message, cancelAction: "OK", actions: [])
  82. // propagate original value
  83. .map { _ in
  84. loggedIn
  85. }
  86. .asDriver(onErrorJustReturn: false)
  87. }
  88.  
  89.  
  90. let signupEnabled = Driver.combineLatest(
  91. validatedUsername,
  92. validatedPassword,
  93. validatedPasswordRepeated,
  94. signingIn
  95. ) { username, password, repeatPassword, signingIn in
  96. username.isValid &&
  97. password.isValid &&
  98. repeatPassword.isValid &&
  99. !signingIn
  100. }
  101. .distinctUntilChanged()
  102.  
  103. return (
  104. validatedUsername: validatedUsername,
  105. validatedPassword: validatedPassword,
  106. validatedPasswordRepeated: validatedPasswordRepeated,
  107. signupEnabled: signupEnabled,
  108. signedIn: signedIn,
  109. signingIn: signingIn
  110. )
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement