rxswift observable 的简单 swift 变量

Posted

技术标签:

【中文标题】rxswift observable 的简单 swift 变量【英文标题】:Simple swift variable to rxswift observable 【发布时间】:2019-04-30 07:29:21 【问题描述】:

我试图从一个简单的 Int 创建一个 observable,这样我就可以在更改时订阅它,但它只在第一次加载时监听,我错过了什么?

private func startObserving() 

    getRating().subscribe(onNext:  (rating: Int) in
        print("NAKO \(rating)")
    )



private func getRating() -> Observable<Int> 
    return Observable.create observer in
        observer.on(.next(self.ratingView.rating()))
        observer.on(.completed)
        return Disposables.create()
    

【问题讨论】:

那是因为您在 observer.on(.next(self.ratingView.rating())) 之后立即调用 observer.on(.completed) 并且当您调用 observer.on(.completed) 时,该特定可观察对象的所有订阅都将被删除,因为您已明确声明此可观察对象现在已完成发射事件你不能在那个 onservable 上进一步调用onNext @SandeepBhandari 我删除了observer.on(.completed),但我仍然没有得到最新的值 那是因为这不是 observables 的工作方式,如果你想每次触发新值,你必须每次在 Observable.create 语句中的 ratingView 评级变化时调用 observer.on(.next(self.ratingView.rating()))。你在这里真正需要的是Subject User publishSubject。示例let value = PublishSubject&lt;Int&gt;() and trigger the subject every time self.ratingView.rating()` 更改。我相信你误解了 observables 的工作原理 因为self.ratingView.rating() 来自第三方,只返回简单的 Int 值,我试图观察 int 值是否发生变化 【参考方案1】:
// 

var changingValue = PublishSubject<Int>()

// 
// let value = self.ratingView.rating()
// changingValue.onNext(value)           // inform observers like so
//



private let disposeBag = DisposeBag()

changingValue.asObservable()
            .subscribe(onNext:  [weak self] (value) in
                print("NAKO \(value)")
            )
            .disposed(by: disposeBag)

【讨论】:

【参考方案2】:

您需要将评分值转换为值流,如果您使用 onCompleted 流将完成,因此无需使用 onCompleted。

let rating = self.ratingView.rating()
Observable.of(rating)
    .subscribe(onNext:  (value: Int) in
        print(value)
    )
    .disposed(by: disposeBag)

【讨论】:

【参考方案3】:

我认为如果你无权修改原始代码,你唯一能做的就是这样:

class YourRatingView: RatingView 
    private let ratingSubject: ReplaySubject<Int>

    override var rating: Int 
        get  return super.rating 
        set  
            super.rating = newValue
            ratingSubject.on(.next(super.rating))
        
    

    override init()
        ratingSubject = ReplaySubject<Int>.create(bufferSize: 1)
        super.init()
        ratingSubject.on(.next(super.rating))
    

    var rating_rx: Observable<Int> 
        return ratingSubject.asObservable()
    

看我使用的是ReplaySubject,所以每次订阅时,您至少会收到最后一个评分值。然后在每次更改后,您都会在订阅中收到一个事件。

使用示例:

let ratingView = YourRatingView()

ratingView.rating_rx.subscribe(onNext:  rating in
    print(rating)
).disposed(by: disposeBag)

【讨论】:

以上是关于rxswift observable 的简单 swift 变量的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift,依赖链的下载返回相同的 Observable 类型

RxSwift observable 创建,它采用流本身的最后一个值

如何测试 RxSwift 变量和 RxCocoa Observable 之间的 UI 绑定?

RxSwift高阶函数merge解读

Observable 的 RxSwift 用途

RxSwift:延迟 observable 直到另一个 observable 完成?