Как поясняет комментарий консоли, это предупреждение может быть подавлено с помощью .observeOn(MainScheduler.asyncInstance)
, например:
Observable<Int>.from([1, 2, 3, 4]).concat(Observable.error(RequestError.dataError))
.observeOn(MainScheduler.asyncInstance) // this is the magic that makes it work.
.retryWhen { error in
return error.enumerated().flatMap { (index, error) -> Observable<Int> in
let maxRetry = 1
print("Index:", index)
guard index < maxRetry else { throw RequestError.tooMany }
return Observable.timer(1, scheduler: MainScheduler.instance)
}
}
.subscribe(onNext: { value in
print("This: \(value)")
}, onError: { error in
print("ERRRRRRR: \(error)")
})
Я позволил себе внести несколько небольших корректировок в ваш пример кода, чтобы показать альтернативный способнапишите, что у вас есть.
Дополнительная информация
Вы попросили объяснить (а), почему добавление ObserveOn работает, и (б), почему оно необходимо.
Что .observeOn(MainScheduler.asyncInstance)
Он направляет запрос в альтернативный поток, где событие может закончиться, а затем снова отправляет событие в основной поток.Другими словами, это похоже на следующее:
.observeOn(backgroundScheduler).observeOn(MainScheduler.instance)
Где backgroundScheduler
определяется следующим образом:
let backgroundScheduler = SerialDispatchQueueScheduler(qos: .default)
По крайней мере, это мое понимание.
А почему?это нужно, я не могу сказать.Возможно, вы нашли ошибку в библиотеке, потому что использование задержки в 1 секунду работает без наблюдения.