rxswift observable 的简单 swift 变量
Posted
技术标签:
【中文标题】rxswift observable 的简单 swift 变量【英文标题】:Simple swift variable to rxswift observable 【发布时间】:2019-04-30 07:29:21 【问题描述】:我试图从一个简单的 Int 创建一个 observable,这样我就可以在更改时订阅它,但它只在第一次加载时监听,我错过了什么?
private func startObserving()
getRating().subscribe(onNext: (rating: Int) in
print("NAKO \(rating)")
)
private func getRating() -> Observable<Int>
return Observable.create observer in
observer.on(.next(self.ratingView.rating()))
observer.on(.completed)
return Disposables.create()
【问题讨论】:
那是因为您在observer.on(.next(self.ratingView.rating()))
之后立即调用 observer.on(.completed)
并且当您调用 observer.on(.completed)
时,该特定可观察对象的所有订阅都将被删除,因为您已明确声明此可观察对象现在已完成发射事件你不能在那个 onservable 上进一步调用onNext
@SandeepBhandari 我删除了observer.on(.completed)
,但我仍然没有得到最新的值
那是因为这不是 observables 的工作方式,如果你想每次触发新值,你必须每次在 Observable.create
语句中的 ratingView 评级变化时调用 observer.on(.next(self.ratingView.rating()))
。你在这里真正需要的是Subject
User publishSubjectlet value = PublishSubject<Int>() and trigger the subject every time
self.ratingView.rating()` 更改。我相信你误解了 observables 的工作原理self.ratingView.rating()
来自第三方,只返回简单的 Int 值,我试图观察 int 值是否发生变化
【参考方案1】:
//
var changingValue = PublishSubject<Int>()
//
// let value = self.ratingView.rating()
// changingValue.onNext(value) // inform observers like so
//
private let disposeBag = DisposeBag()
changingValue.asObservable()
.subscribe(onNext: [weak self] (value) in
print("NAKO \(value)")
)
.disposed(by: disposeBag)
【讨论】:
【参考方案2】:您需要将评分值转换为值流,如果您使用 onCompleted 流将完成,因此无需使用 onCompleted。
let rating = self.ratingView.rating()
Observable.of(rating)
.subscribe(onNext: (value: Int) in
print(value)
)
.disposed(by: disposeBag)
【讨论】:
【参考方案3】:我认为如果你无权修改原始代码,你唯一能做的就是这样:
class YourRatingView: RatingView
private let ratingSubject: ReplaySubject<Int>
override var rating: Int
get return super.rating
set
super.rating = newValue
ratingSubject.on(.next(super.rating))
override init()
ratingSubject = ReplaySubject<Int>.create(bufferSize: 1)
super.init()
ratingSubject.on(.next(super.rating))
var rating_rx: Observable<Int>
return ratingSubject.asObservable()
看我使用的是ReplaySubject
,所以每次订阅时,您至少会收到最后一个评分值。然后在每次更改后,您都会在订阅中收到一个事件。
使用示例:
let ratingView = YourRatingView()
ratingView.rating_rx.subscribe(onNext: rating in
print(rating)
).disposed(by: disposeBag)
【讨论】:
以上是关于rxswift observable 的简单 swift 变量的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift,依赖链的下载返回相同的 Observable 类型
RxSwift observable 创建,它采用流本身的最后一个值