【问题标题】:RxSwift) Subscribing one observable two time not workingRxSwift)订阅一个 observable 两次不工作
【发布时间】:2020-11-16 12:25:21
【问题描述】:

可观察代码

private let reviewPublish = PublishSubject<Review>()

var review$: Observable<Review> {
    return reviewPublish.asObservable()
}

发布代码

DB_REVIEWS.observe(.value){ snapShot in
    for child in snapShot.children {
        guard let snap = child as? DataSnapshot else { return }
        guard let data = snap.value as? [String: Any] else { return }
                
        var review = Review()
        review = self.changeDictionaryToReview(data, snap.key)
        self.reviewPublish.onNext(review)
   }
   self.reviewPublish.onCompleted()
} 

订阅码

DBUtil.shared.review$.subscribe(onNext: {
    self.reviews.append($0)
}).disposed(by: self.disposeBag)

问题

我在应用程序启动时订阅了。因此,从数据库中获取评论并将它们存储在数组中成功了。但是,无法实时反映。应用启动后,如果用户添加新评论,则不会反映。 "self.reviewPublish.onNext(review)" 有效,但 viewController 中的订阅代码无效。

有什么想法吗?

【问题讨论】:

  • 当你在发布主题这样的主题上调用这个 self.reviewPublish.onCompleted() 时,这意味着这个流已经完成并且应该完成,如果你想保留它就不应该调用它活着
  • 感谢您的友好回答。多亏了你,我才能解决它。

标签: ios swift firebase firebase-realtime-database rx-swift


【解决方案1】:

根据您迄今为止在问题中提供的信息,我希望代码看起来像这样,而不是您拥有的:

extension Review {
    init(_ data: [String : Any], _ key: String) {
        // store what you need to here
    }
}

func reviews() -> Observable<[Review]> {
    return Observable.create { observer in
        DB_REVIEWS.observe(.value) { snapShot in
            let reviews = snapShot.children.compactMap { (child) -> Review? in
                guard let snap = child as? DataSnapshot else { return nil }
                guard let data = snap.value as? [String: Any] else { return nil }
                return Review(data, snap.key)
            }
            observer.onNext(reviews)
        }
        return Disposables.create { /* stop observing here */ }
    }
}

根本没有理由将发布者添加到系统中。我希望有一些方法可以取消观察,所以把它放在 Disposables.create 函数中。如果您必须将reviews 函数放在一个类中,那么 DB_REVIEWS 类和我猜想的一样好。

【讨论】:

  • 感谢您的建议。其实我还没习惯 RxSwift
  • 没问题。一般来说,当你处理一个回调闭包时,就像我在上面做的那样,把它包装在一个 Observable.create 中,你就可以上路了。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多