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 或 Driver 花费的时间太长