【问题标题】:Simple swift variable to rxswift observablerxswift observable 的简单 swift 变量
【发布时间】: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 值是否发生变化

标签: ios swift rx-swift


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多