【问题标题】:How to : Detect if a observable has not emitted any events for specific time in RxSwift如何:检测可观察对象是否在 RxSwift 中的特定时间未发出任何事件
【发布时间】:2020-02-11 07:01:18
【问题描述】:

刚接触 rxSwift 并尝试学习一个简单的函数。当.timeout 用于可观察序列时,如果序列中的一个可观察对象没有发出事件,它将返回错误消息Unhandled error happened: Sequence timeout.

这是我处理 observable 不再接收事件的尝试,如果有更好的方法来实现这一点,请提出建议!

如果.timeout 运算符返回错误消息,我如何触发警报。

.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)
  }

【问题讨论】:

  • 您是否只是在寻找在超时到来时显示的警报,如果是这样,您希望用户必须点击警报才能继续或仅显示通知?
  • @TalonBrown 希望在超时到来时显示警报

标签: swift error-handling timeout reactive-programming rx-swift


【解决方案1】:

制作 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)

【讨论】:

    【解决方案2】:

    在做一些文档研究时,我发现了 rxSwift 的 onError: handler。

    这将在收到 errorEvent 时触发,从那里我可以运行一个函数 onError: {err in errorAlert(); print("error \(err)")}这解决了问题。

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2018-07-29
      • 1970-01-01
      • 2018-06-03
      • 2018-09-07
      • 1970-01-01
      • 2019-05-18
      • 2020-04-08
      • 2012-03-03
      相关资源
      最近更新 更多