如何:检测 Observable 是否在 RxSwift 中的特定时间未发出任何事件
How to : Detect if a observable has not emitted any events for specific time in RxSwift
rxSwift 的新手,正在尝试学习一个比较简单的函数。当 .timeout
用于可观察序列时,如果序列中的一个可观察对象没有发出事件,它将 return 一条错误消息 Unhandled error happened: Sequence timeout.
。
这是我尝试处理一个不再接收事件的observable,如果有更好的实现方法请提出!
如果 .timeout
运算符 return 出现错误消息,我如何触发警报。
.timeout
资料:
摘要
对可观察序列中的每个元素应用超时策略。如果下一个元素在指定的超时持续时间内没有收到,从它的前一个元素开始,一个 TimeoutError 被传播给观察者。
宣言
dueTime
超时前值之间的最大持续时间。
scheduler
调度程序 运行 超时计时器开启。
Returns
在超时情况下带有 RxError.timeout 的可观察序列。
代码:
Observable.combineLatest(currentUser, opponent, game)
.timeout(3, scheduler: MainScheduler.instance)
.subscribe(onNext: { (arg) -> Void in
let (currentUser, opponent, game) = arg
if game.isPlayersTurn(currentUser) {
self._turnState.onNext(.yourTurn)
} else if game.isPlayersTurn(opponent) {
self._turnState.onNext(.theirTurn)
} else if game.isTie() {
self._turnState.onNext(.tie)
} else if game.gameData.winner == currentUser.userId {
self._turnState.onNext(.win(opponentWon: false))
} else if game.gameData.winner == opponent.userId {
self._turnState.onNext(.win(opponentWon: true))
}
})
.disposed(by: disposeBag)
}
制作 UIAlert
首先,制作一个alertController。
let avc = UIAlertController(title: "Your Title Here", message: "The message you wish to display", preferredStyle: .alert)
接下来,您需要进行操作;这些具有在按下操作按钮后在完成处理程序中执行代码的选项
let yourAction = UIAlertAction(title: "Save", style: .default) { (action) in
//Your code that wishes to be executed after the butt has been pressed
}
然后,将动作添加到控制器中
avc.addAction(yourAction)
那么您需要做的就是显示警报
present(avc, animated: true, completion: nil)
通过一些文档研究,我发现了 rxSwift 的 onError: handler。
这将在收到 errorEvent 时触发,从那里我可以 运行 一个函数
onError: {err in errorAlert(); print("error \(err)")}
问题解决了。
rxSwift 的新手,正在尝试学习一个比较简单的函数。当 .timeout
用于可观察序列时,如果序列中的一个可观察对象没有发出事件,它将 return 一条错误消息 Unhandled error happened: Sequence timeout.
。
这是我尝试处理一个不再接收事件的observable,如果有更好的实现方法请提出!
如果 .timeout
运算符 return 出现错误消息,我如何触发警报。
.timeout
资料:
摘要
对可观察序列中的每个元素应用超时策略。如果下一个元素在指定的超时持续时间内没有收到,从它的前一个元素开始,一个 TimeoutError 被传播给观察者。 宣言
dueTime
超时前值之间的最大持续时间。
scheduler
调度程序 运行 超时计时器开启。
Returns
在超时情况下带有 RxError.timeout 的可观察序列。
代码:
Observable.combineLatest(currentUser, opponent, game)
.timeout(3, scheduler: MainScheduler.instance)
.subscribe(onNext: { (arg) -> Void in
let (currentUser, opponent, game) = arg
if game.isPlayersTurn(currentUser) {
self._turnState.onNext(.yourTurn)
} else if game.isPlayersTurn(opponent) {
self._turnState.onNext(.theirTurn)
} else if game.isTie() {
self._turnState.onNext(.tie)
} else if game.gameData.winner == currentUser.userId {
self._turnState.onNext(.win(opponentWon: false))
} else if game.gameData.winner == opponent.userId {
self._turnState.onNext(.win(opponentWon: true))
}
})
.disposed(by: disposeBag)
}
制作 UIAlert
首先,制作一个alertController。
let avc = UIAlertController(title: "Your Title Here", message: "The message you wish to display", preferredStyle: .alert)
接下来,您需要进行操作;这些具有在按下操作按钮后在完成处理程序中执行代码的选项
let yourAction = UIAlertAction(title: "Save", style: .default) { (action) in
//Your code that wishes to be executed after the butt has been pressed
}
然后,将动作添加到控制器中
avc.addAction(yourAction)
那么您需要做的就是显示警报
present(avc, animated: true, completion: nil)
通过一些文档研究,我发现了 rxSwift 的 onError: handler。
这将在收到 errorEvent 时触发,从那里我可以 运行 一个函数
onError: {err in errorAlert(); print("error \(err)")}
问题解决了。