rx.tap 订阅已完成的按钮
Button with rx.tap subscription reaching completed
我是 RxSwift 的新手,我正在尝试实现登录 facebook 功能,这就是我正在做的事情:
loginButton.rx.tap
.debug("login tapped")
.flatMap { [weak self] ()->Observable<AccessToken> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.loginFacebook(from: strongSelf)
}
.flatMap { [weak self] accessToken->Observable<(accessToken: String, userId: String)> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.requestUserInfo(token: accessToken)
}
.flatMap { [weak self] (accessToken: String, userId: String)->Observable<LoginResult> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.authenticate(accessToken: accessToken, userId: userId)
}
.catchError({ error -> Observable<LoginResult> in
return Observable.just(LoginResult.failure(error: error as! NetworkError))
})
.subscribe (onNext:{ [weak self] result in
guard let strongSelf = self else {
return
}
switch result {
case .success:
// do something with success
}
case .failure(let error):
// do something with error
}
}, onCompleted: {
print("rx.tap completed")
})
.disposed(by: disposeBag)
当我点击登录按钮然后关闭弹出的 Facebook 登录 window 时,我对 rx.tap
的订阅达到 onCompleted
,所以当我尝试点击再次按下按钮,没有任何反应。我应该如何处理这种情况?任何建议都会有所帮助。
这是你链的简化方案:
loginButton.rx.tap
.flatMap({ (_) -> Observable<Void> in
throw NSError(domain: "", code: 0, userInfo: [:])
})
.catchError({ error -> Observable<Void> in
return Observable<Void>.just()
})
.subscribe()
当你在 catchError
块中产生 Observable<Void>.just()
或在其他块中产生类似的东西时,它只会触发一次,这就是你收到 completed
并且之后没有其他任何事情发生的原因。例如,我建议将您拥有的所有代码放入 flatMapLatest
中。结果代码将是:
loginButton.rx.tap
.flatMapLatest({ _ -> Observable<Void> in
return Observable<Void>
.just()
.flatMap({ (_) -> Observable<Void> in
throw NSError(domain: "", code: 0, userInfo: [:])
})
.catchError({ error -> Observable<Void> in
return Observable<Void>.just()
})
})
.subscribe()
希望对您有所帮助
P.S。检查来自 RxSwift 开发团队成员的 similar answer
我是 RxSwift 的新手,我正在尝试实现登录 facebook 功能,这就是我正在做的事情:
loginButton.rx.tap
.debug("login tapped")
.flatMap { [weak self] ()->Observable<AccessToken> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.loginFacebook(from: strongSelf)
}
.flatMap { [weak self] accessToken->Observable<(accessToken: String, userId: String)> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.requestUserInfo(token: accessToken)
}
.flatMap { [weak self] (accessToken: String, userId: String)->Observable<LoginResult> in
guard let strongSelf = self else {
throw NetworkError.requestCancelled
}
return strongSelf.viewModel.authenticate(accessToken: accessToken, userId: userId)
}
.catchError({ error -> Observable<LoginResult> in
return Observable.just(LoginResult.failure(error: error as! NetworkError))
})
.subscribe (onNext:{ [weak self] result in
guard let strongSelf = self else {
return
}
switch result {
case .success:
// do something with success
}
case .failure(let error):
// do something with error
}
}, onCompleted: {
print("rx.tap completed")
})
.disposed(by: disposeBag)
当我点击登录按钮然后关闭弹出的 Facebook 登录 window 时,我对 rx.tap
的订阅达到 onCompleted
,所以当我尝试点击再次按下按钮,没有任何反应。我应该如何处理这种情况?任何建议都会有所帮助。
这是你链的简化方案:
loginButton.rx.tap
.flatMap({ (_) -> Observable<Void> in
throw NSError(domain: "", code: 0, userInfo: [:])
})
.catchError({ error -> Observable<Void> in
return Observable<Void>.just()
})
.subscribe()
当你在 catchError
块中产生 Observable<Void>.just()
或在其他块中产生类似的东西时,它只会触发一次,这就是你收到 completed
并且之后没有其他任何事情发生的原因。例如,我建议将您拥有的所有代码放入 flatMapLatest
中。结果代码将是:
loginButton.rx.tap
.flatMapLatest({ _ -> Observable<Void> in
return Observable<Void>
.just()
.flatMap({ (_) -> Observable<Void> in
throw NSError(domain: "", code: 0, userInfo: [:])
})
.catchError({ error -> Observable<Void> in
return Observable<Void>.just()
})
})
.subscribe()
希望对您有所帮助
P.S。检查来自 RxSwift 开发团队成员的 similar answer