簡體   English   中英

RxSwift - 訂閱方法

[英]RxSwift - subscribe to a method

有沒有辦法讓RxSwift訂閱一個返回完成塊的方法?

例如,讓我們有這個對象:

struct Service {

    private var otherService = ...
    private var initSucceeded = PublishSubject<Bool>()

    var initSucceededObservale: Observable<Bool> {
        return initSucceeded.asObservable()
    }

    func init() {
        otherService.init {(success) in
            self.initSucceeded.onNext( success)
        }
    }
}

並且在不同的地方有一種方法可以在服務初始化時得到通知:

service.initSucceededObservable.subscribe(onNext: {
    [unowned self] (value) in
    ...
}).addDisposableTo(disposeBag)

service.init()

會有更簡單的解決方案嗎?

我喜歡使用Variables來做這類事情。 此外,我建議在這里使用課程,因為你正在追蹤獨特的狀態,而不只是關注自己的價值觀。

class Service {
    private let bag = DisposeBag()
    public var otherService: Service?

    private var isInitializedVariable = Variable<Bool>(false)

    public var isInitialized: Observable<Bool> {
        return isInitializedVariable.asObservable()
    }

    public init(andRelyOn service: Service? = nil) {
        otherService = service

        otherService?.isInitialized
            .subscribe(onNext: { [unowned self] value in
                self.isInitializedVariable.value = value
            })
            .addDisposableTo(bag)
    }

    public func initialize() {
        isInitializedVariable.value = true
    }

}

var otherService = Service()
var dependentService = Service(andRelyOn: otherService)

dependentService.isInitialized
                .debug()
                .subscribe({
                    print($0)
                })

otherService.initialize() // "Initializes" the first service, causing the second to set it's variable to true.

你可以使用一個懶惰的屬性:

lazy let initSucceededObservale: Observable<Bool> = {
    return Observable.create { observer in
        self.otherService.init {(success) in
            observer.on(.next(success))
            observer.on(.completed)
        }
        return Disposables.create()
    }
}()

然后你可以使用:

service.init()
service.initSucceededObservable.subscribe(onNext: {
    [unowned self] (value) in
    ...
}).addDisposableTo(disposeBag)

如果您在downvoting之前遇到問題,請在評論中告訴我們,謝謝。

暫無
暫無

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

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