RXSwift,检测到重入异常
RXSwift, Reentrancy anomaly was detected
我是 RXSwift 的初学者,我的代码有问题
我有代码:
let dartScore = PublishSubject<Int>()
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.do(onNext: {
if [=10=] == 0 {
dartScore.onCompleted()
}
})
.subscribe({
print([=10=].isStopEvent ? [=10=] : [=10=].element!)
})
.disposed(by: disposeBag)
dartScore.onNext(13)
dartScore.onNext(50)
dartScore.onNext(60)
dartScore.onNext(378)
我得到错误:
⚠️ Reentrancy anomaly was detected. ⚠️
Debugging: To debug this issue you can set a breakpoint in /****RxSwift/RxSwift/Rx.swift:97 and observe the call stack.
Problem: This behavior is breaking the observable sequence grammar. next (error | completed)?
This behavior breaks the grammar because there is overlapping between sequence events.
Observable sequence is trying to send an event before sending of previous event has finished.
为什么我不能在 .do(onNext) 中执行“.onCompleted()”,我应该怎么做才能避免警告?
我正在使用 XCode 9.0,swift 4,RXSwift 4.0.0
谢谢
此致
你不能在 .onNext()
中执行 .onCompleted()
,因为在那种情况下你会看到 observable 吃掉自己的尾巴。这也会导致内存循环。
正如@Enigmativity 在评论中建议的那样,您应该使用takeWhile()
来处理这种情况:
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.takeWhile { [=10=] != 0 }
.subscribe({
print([=10=].isStopEvent ? [=10=] : [=10=].element!)
})
上面生成了一个新的可观察对象,当值为 0 时完成。
与 OP 的问题没有直接关系,但我是在搜索 Reentrancy anomaly was detected
时来到这里的,对我来说,原因很简单,我在代码中删除了 NSView 的 addSubview(viewInQuestion)
行MacOs,虽然仍在约束设置中使用 viewInQuestion
...添加 viewInQuestion
作为子视图解决了问题。
我是 RXSwift 的初学者,我的代码有问题
我有代码:
let dartScore = PublishSubject<Int>()
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.do(onNext: {
if [=10=] == 0 {
dartScore.onCompleted()
}
})
.subscribe({
print([=10=].isStopEvent ? [=10=] : [=10=].element!)
})
.disposed(by: disposeBag)
dartScore.onNext(13)
dartScore.onNext(50)
dartScore.onNext(60)
dartScore.onNext(378)
我得到错误:
⚠️ Reentrancy anomaly was detected. ⚠️
Debugging: To debug this issue you can set a breakpoint in /****RxSwift/RxSwift/Rx.swift:97 and observe the call stack.
Problem: This behavior is breaking the observable sequence grammar.
next (error | completed)?
This behavior breaks the grammar because there is overlapping between sequence events. Observable sequence is trying to send an event before sending of previous event has finished.
为什么我不能在 .do(onNext) 中执行“.onCompleted()”,我应该怎么做才能避免警告?
我正在使用 XCode 9.0,swift 4,RXSwift 4.0.0
谢谢
此致
你不能在 .onNext()
中执行 .onCompleted()
,因为在那种情况下你会看到 observable 吃掉自己的尾巴。这也会导致内存循环。
正如@Enigmativity 在评论中建议的那样,您应该使用takeWhile()
来处理这种情况:
dartScore.asObservable()
.scan(501) { intermediate, newValue in
let result = intermediate - newValue
return result >= 0 ? result : intermediate
}
.takeWhile { [=10=] != 0 }
.subscribe({
print([=10=].isStopEvent ? [=10=] : [=10=].element!)
})
上面生成了一个新的可观察对象,当值为 0 时完成。
与 OP 的问题没有直接关系,但我是在搜索 Reentrancy anomaly was detected
时来到这里的,对我来说,原因很简单,我在代码中删除了 NSView 的 addSubview(viewInQuestion)
行MacOs,虽然仍在约束设置中使用 viewInQuestion
...添加 viewInQuestion
作为子视图解决了问题。