Sei*_*aru 1 xcode system.reactive swift rx-swift
我是RXSwift的初学者,我的代码有问题
我有代码:
let dartScore = PublishSubject<Int>()
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.do(onNext: {
if $0 == 0 {
dartScore.onCompleted()
}
})
.subscribe({
print($0.isStopEvent ? $0 : $0.element!)
})
.disposed(by: disposeBag)
dartScore.onNext(13)
dartScore.onNext(50)
dartScore.onNext(60)
dartScore.onNext(378)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
⚠️检测到可重入异常.⚠️
调试:要调试此问题,您可以在/****RxSwift/RxSwift/Rx.swift:97中设置断点并观察调用堆栈.
问题:此行为违反了可观察的序列语法.
next (error | completed)?此行为会破坏语法,因为序列事件之间存在重叠.可观察序列试图在发送先前事件之前发送事件.
为什么我不能在.do(onNext)里面做".onCompleted()",我应该怎么做以避免警告?
我正在使用XCode 9.0,swift 4,RXSwift 4.0.0
谢谢
最好的祝福
你不能在.onCompleted()里面做,.onNext()因为在这种情况下,你会观察到吃掉自己的尾巴.这也会导致内存循环.
正如@Enigmativity在评论中建议的那样,你应该用它takeWhile()来处理这种情况:
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.takeWhile { $0 != 0 }
.subscribe({
print($0.isStopEvent ? $0 : $0.element!)
})
Run Code Online (Sandbox Code Playgroud)
上面生成一个新的observable,当值为0时完成.