RxSwift:点按一个按钮即可向Alamofire发出请求,如何使其生效?

问题描述 投票:1回答:1

我有一些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完成将终止外部流,则意味着不再在您的流中注册更多的按钮点击,这实际上没有任何意义。


this question

  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 in // .....

ios swift rx-swift
1个回答
2
投票
这里的主要问题是,在执行网络请求时,您没有等待网络呼叫做出响应。因此,在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)

© www.soinside.com 2019 - 2024. All rights reserved.