如何:检测 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)")} 问题解决了。