RxSwift)订阅一个可观察的两次不工作

RxSwift) Subscribing one observable two time not working

可观察代码

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([=12=])
}).disposed(by: self.disposeBag)

问题

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

有什么想法吗?

根据你到目前为止在问题中提供的信息,我希望代码看起来像这样而不是你所拥有的:

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 函数放在 class 中,那么 DB_REVIEWS class 和我猜的一样好。