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 和我猜的一样好。
可观察代码
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 和我猜的一样好。