RxSwift)订阅一个 observable 两次不工作

Posted

技术标签:

【中文标题】RxSwift)订阅一个 observable 两次不工作【英文标题】:RxSwift) Subscribing one observable two time not working 【发布时间】: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() 时,这意味着这个流已经完成并且应该完成,如果你想保留它就不应该调用它活着 感谢您的友好回答。多亏了你,我才能解决它。 【参考方案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 中,你就可以上路了。

以上是关于RxSwift)订阅一个 observable 两次不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxSwift 中取消订阅 Observable?

RxSwift 系列

在 RxSwift 中订阅 Observable 或 Driver 花费的时间太长

RxSwift 订阅序列

在 RxSwift PublishSubject 上完成后订阅最后一个值

Rxswift 在事件发生时取消观察者并重新订阅