Map
Map
Shorthands
sessionNotExpired
.map(\.authentication.refreshToken.value)
Keypath - \ : shorthand for the type of Session.Entry
Not referencing actual Session.Entry object. Just passing a key like a dictionary key path.
Compiler infers the type using the \.
.map(Session.Entry.authentication.refreshToken.value)
doesnt compile
but \
is saying use a reference and map internally.
sessionNotExpired
.map { $0.authentication.refreshToken.value }
Split
// Not present? Optional ?
let (isSSOEnabled, isSSODisabled) = sessionEntry
.filter { session in
return session == nil
}
.mapToVoid()
.split { _ in context.account.onlySSO }
.map { _ in context.account.onlySSO }
.split{$0}
Navigation Context
You can check the difference between these two options we have for mapping NavigationContext to present them in the same Rx chain.
Some of the code refers to the rxSwift extensions file
1st example
Old:
// User requested to skip the onboarding screens
skipButton
.rx
.tap
.asObservable()
.mapToVoid()
.withUnretained(self)
.subscribeNext(weak: self, OnboardingFlowViewController.showSignUpWebView)
.disposed(by: disposeBag)
private func showSignUpWebView() {
    let signUpViewController = SignUpViewController(context: context)
    navigationController?
      .pushViewController(signUpViewController,
                animated: true)
  }
New:
// User requested to skip the onboarding screens
skipButton
.rx
.tap
.asObservable()
.mapToVoid()
.withUnretained(self)
.subscribe(onNext: { owner, _ in
let view = SignUpViewController(context: owner.context)
owner.navigationController?.pushViewController(view, animated: true)
})
.disposed(by: disposeBag)
2nd Example
successfulSubject // Void
.map { UserTrialsCreationContext(hidesButton: true) }
.map(NavigationContext.startBuildingApp)
.map(ViewControllerFactory.create)
.delay(.seconds(3), scheduler: MainScheduler.instance)
.withUnretained(windowManager)
.subscribe(onNext: { window, view in
let navigationController = UINavigationController(rootViewController: view)
window.rootViewController?
.present(navigationController, animated: true)
})
.disposed(by: disposeBag)
The delay was added due
// Async Windows events firing mitigating timing issue.