我有一些UI rx按钮点击,我想将其连接到网络rx部分。
这里是Rx btn龙头部分:
btn.rx.tap.take(1).flatMap { [unowned self] () -> Observable<Bool> in
// ...
return NetManager.standard.request()
}.debug().do(onNext: { _ in
print("The data flows here")
}).flatMapLatest { (echo: Bool) -> Observable<Bool> in
if echo{
if let app = UIApplication.shared.delegate as? AppDelegate{
app.goHome()
}
return Observable.of(true)
}
else{
return Observable.of(false)
}
}.subscribe(onNext: { (result) in
// ... , do sth with result
}).disposed(by: rx.disposeBag)
这里是Alamofire的净要求部分:
class NetManager: NSObject {
static let standard = NetManager()
var dataRequest: DataRequest?
func request() -> Observable<Bool> {
return Observable<Bool>.create{ (observer) -> Disposable in
let data = // ...
// ...
self.dataRequest = AF.request(aURL, method: HTTPMethod.post, parameters: data, encoder: JSONParameterEncoder.prettyPrinted, headers: aHead).response { (response: DataResponse<Data?>) in
self.hud?.hide()
if let data = response.data{
observer.onNext(true)
// ....
}
else{
observer.onNext(false)
}
}
observer.onCompleted()
return Disposables.create{}
}
}
}
这里是调试信息:
Controller.swift:141(viewDidLoad())->已订阅
Controller.swift:141(viewDidLoad())->事件已完成
Controller.swift:141(viewDidLoad())-> isDisposed
结果为,do( next )
部分似乎尚未被调用。因为控制台中没有print
。
问题是,如何使接收逻辑工作?
这是我尝试过的:
将btn.rx.tap.flatMap
转到btn.rx.tap.take(1).flatMap
由于this issue起>
如果flatMap完成将终止外部流,则意味着不再在您的流中注册更多的按钮点击,这实际上没有任何意义。
btn.rx.tap.map { () -> Observable<Bool> in return NetManager.standard.request() }.flatMapLatest { (observer: Observable<Bool>) -> Observable<Bool> in // of cource, I can subscribe to observer /* observer.subscribe(onNext: { (echo) in }) */ // how to get the event element elegantly. return Observable.of(false) }.subscribe(onNext: { (_) in }).disposed(by: rx.disposeBag)
如何更优雅地做到这一点。
我有一些UI rx按钮点击,我想将其连接到网络rx部分。这是Rx btn抽头部分:btn.rx.tap.take(1).flatMap {[unown self]()-> Observable
observer.onComplete()
之前触发observer.onNext()
class NetManager: NSObject {
static let standard = NetManager()
var dataRequest: DataRequest?
func request() -> Observable<Bool> {
return Observable<Bool>.create { (observer) -> Disposable in
let data = // ...
// ...
self.dataRequest = AF.request(aURL, method: HTTPMethod.post, parameters: data, encoder: JSONParameterEncoder.prettyPrinted, headers: aHead).response { (response: DataResponse<Data?>) in
self.hud?.hide()
if let data = response.data {
observer.onNext(true)
// ...
}
else {
observer.onNext(false)
}
observer.onComplete() // Moving it here instead will wait for the response
}
return Disposables.create { }
}
}
}
此时,您的代码应该可以正常工作,但是您仍然使一个非常简单的事情变得过于复杂。这里是做什么:
btn.rx.tap .flatMap { _ in return NetManager.standard.request() } .subscribe(onNext: { (success) in if success { if let app = UIApplication.shared.delegate as? AppDelegate { app.goHome() } } }) .disposed(by: rx.disposeBag)