An open API service indexing awesome lists of open source software.

https://github.com/pircate/rxswiftdemo

RxSwift Demo
https://github.com/pircate/rxswiftdemo

mvvm rxswift

Last synced: about 1 year ago
JSON representation

RxSwift Demo

Awesome Lists containing this project

README

          

# LightCloud
RxSwift 登录/注册/搜索/编辑/网络 Demo

## ViewModel
```swift
final class LoginViewModel {

struct Input {
let username: Observable
let password: Observable
let captchaTap: ControlEvent
let loginTap: ControlEvent
}

struct Output {
let isEnabled: Driver
let captcha: Driver<(title: String, isEnabled: Bool)>
let login: Driver
let state: Driver
}
}

extension LoginViewModel: ViewModelType {

func transform(_ input: LoginViewModel.Input) -> LoginViewModel.Output {
let isEnabled = input.verifyloginButton()

let state = State()
let captcha = input.requestLoginCaptcha(state)
let login = input.requestLogin(state)

return Output(isEnabled: isEnabled,
captcha: captcha,
login: login,
state: state.asDriver(onErrorJustReturn: .idle))
}
}

fileprivate extension LoginViewModel.Input {

func verifyloginButton() -> Driver {
return Observable
.combineLatest(username.isEmpty, password.isEmpty) { !$0 && !$1 }
.asDriver(onErrorJustReturn: false)
}

func requestLoginCaptcha(_ state: State) -> Driver<(title: String, isEnabled: Bool)> {
return captchaTap.withLatestFrom(username)
.flatMap{
LCUser.rx.requestLoginCaptcha(mobile: $0)
.trackState(state, success: "验证码已发送")
.catchErrorJustComplete()
}
.flatMap(to: 60.countdown())
.asDriver(onErrorJustReturn: (title: "重新发送", isEnabled: true))
}

func requestLogin(_ state: State) -> Driver {
let usernameAndPassword = Observable
.combineLatest(username, password) { (username: $0, password: $1) }
return loginTap.withLatestFrom(usernameAndPassword)
.flatMap {
LCUser.rx.login(mobile: $0.username, captcha: $0.password)
.trackState(state, success: "登录成功")
.catchErrorJustComplete()
}
.map(to: true)
.asDriver(onErrorJustReturn: false)
}
}
```