Как: определить, не наблюдал ли наблюдаемый объект какие-либо события в течение определенного времени в RxSwift - PullRequest
0 голосов
/ 14 октября 2019

Новичок в rxSwift и пытается освоить несколько простую функцию. Когда .timeout используется в наблюдаемой последовательности, он вернет сообщение об ошибке Unhandled error happened: Sequence timeout., если одна из наблюдаемых в последовательности не произвела событие.

Это моя попытка больше не обрабатывать наблюдаемуюполучение событий, если есть лучший способ добиться этого, пожалуйста, предложите это!

Как я могу отключить оповещение, если оператор .timeout возвращает сообщение об ошибке.

.timeout информация: Summary

Применяет политику тайм-аута для каждого элемента в наблюдаемой последовательности. Если следующий элемент не получен в течение указанного времени ожидания, начиная с его предшественника, 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)
  }

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Выполняя некоторые исследования документации, я обнаружил, что rxSwift onError: handler.

Это сработает при получении errorEvent, оттуда я могу запустить функцию onError: {err in errorAlert(); print("error \(err)")}, которая решает проблему.

0 голосов
/ 14 октября 2019

Для создания 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)
...