簡體   English   中英

delaySubscription不適用於rx_tap

[英]delaySubscription doesn't work with rx_tap

這是我的代碼的簡短版本,它將重現該問題:

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let source = button.rx_tap.map { _ in "source" }

        let delay = source.map { _ in "delayed" }
            .delaySubscription(2.0, MainScheduler.sharedInstance)

        [source, delay].toObservable().merge()
            .subscribeNext { print($0) }
            .addDisposableTo(disposeBag)
    }
}

我希望在按下按鈕2秒鍾后發出“延遲”信號,但是沒有這種運氣。 實際發生的情況:第一次點擊按鈕時,“源”觸發,但沒有其他反應。 然后,當我再次點擊時,“源”和“延遲”同時發射。 我發現這是一些線程問題,因此我嘗試在各處添加observeOn(MainScheduler.sharedInstance) ,但沒有幫助。 有任何想法嗎?

更新:通過將.debug()添加到流中,我發現延遲流實際上在2秒后訂閱了源。 但這仍然不能解釋為什么它也不會在2秒后觸發通知。

為了回答我自己的問題,似乎delaySubscription僅適用於冷觀測對象。

timer這樣的冷可觀察對象只有在已訂閱時才開始觸發通知,所有訂閱它的人都會獲得新的序列。 這就是為什么簡單地延遲對冷可觀察對象的訂閱也會延遲所有通知的原因。

一個熱的可觀察對象(例如UI事件)與其所有訂閱者共享相同的序列,因此延遲訂閱絕對不會對其通知產生影響。

相反,我可以使用flatMap運算符將每個源通知轉換為另一個可觀察到的對象,該對象在經過一定延遲后會觸發其唯一的通知,並合並這些可觀察對象的結果:

class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!

let disposeBag = DisposeBag()

override func viewDidLoad() {
    super.viewDidLoad()

    let source = button.rx_tap.map { _ in "source" }

    let delayed = source.flatMap { _ in
        timer(1.0, MainScheduler.sharedInstance)
            .map { _ in "delayed" }
    }

    [source, delayed]
        .toObservable().merge()
        .subscribeNext { print($0) }
        .addDisposableTo(disposeBag)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM