Ios 允许用户取消登录尝试并手动重试,而不破坏观察结果

Ios 允许用户取消登录尝试并手动重试,而不破坏观察结果,ios,swift,rx-swift,Ios,Swift,Rx Swift,假设我有一个登录按钮,它绑定到我虚拟机中的观察者 当用户点击按钮时,它会触发一个异步API调用。VC侦听VM公开的可观察对象的调用结果 我会显示一个取消按钮,以防异步活动被卡住,或者用户意识到他们键入的密码错误并希望重试。如果用户取消,我希望有效地取消或忽略由于第一次点击而发出的事件,并允许用户在准备好后再次点击登录 设置如下所示: enum Action { case start case stop } let loginResult = Observable.merge(l

假设我有一个登录按钮,它绑定到我虚拟机中的观察者

当用户点击按钮时,它会触发一个异步API调用。VC侦听VM公开的可观察对象的调用结果

我会显示一个取消按钮,以防异步活动被卡住,或者用户意识到他们键入的密码错误并希望重试。如果用户取消,我希望有效地取消或忽略由于第一次点击而发出的事件,并允许用户在准备好后再次点击登录

设置如下所示:

enum Action {
    case start
    case stop
}

let loginResult = Observable.merge(loginDidTap.map { Action.start }, cancelDidTap.map { Action.stop })
    .flatMapLatest { action in 
        switch action {
            case .start:
                loginService.login(username, password)
            case .stop:
                Observable.empty()
        }
    }
类SimpleVM{
结构输出{
让登录回复:可观察
}
结构输入{
让loginDidTap:AnyObserver
让我们点击:任何观察者
}
让输出:输出
让输入:输入
private let loginSubject=PublishSubject()
private let cancelSubject=PublishSubject()
init(){
让响应=登录对象
.flatmap最新{uu英寸
loginService.login(用户名、密码)
}
取消主题
.flatmap最新{uu英寸
//在这里做点什么?
}
input=input(loginDidTap:loginsObject.asObserver(),cancelDidTap:cancelSubject.asObserver())
输出=输出(loginResponse:response)
}
}
类SimpleVC:UIViewController{
var登录按钮:UIButton!
var取消按钮:UIButton!
设disposeBag=disposeBag()
func绑定(vm:SimpleVM){
loginButton.rx.tap
.bind(到:vm.input.loginDidTap)
.处置(由:处置人)
取消按钮.rx.tap
.bind(到:vm.input.cancelDidTap)
.处置(由:处置人)
vm.output.loginResponse
.subscribe(onNext:{中的响应)
打印(“获取令牌\(response.info.token)”)
}).处置(由:处置人)
}
}

如何处理“取消”按钮点击,使其有效地“重置”内容,以便用户可以再次尝试登录?

使用以下方法:

enum Action {
    case start
    case stop
}

let loginResult = Observable.merge(loginDidTap.map { Action.start }, cancelDidTap.map { Action.stop })
    .flatMapLatest { action in 
        switch action {
            case .start:
                loginService.login(username, password)
            case .stop:
                Observable.empty()
        }
    }