Как отложить подписку на RxJava как с успехом, так и с ошибкой?

Swift 4.0

Для async Request-Response вы можете выполнить обработчик завершения пользователем. См. Ниже, я изменил ваше решение с помощью парадигмы обработки завершения.

func getGenres(_ completion: @escaping (NSArray) -> ()) {

        let urlPath = "http://creative.coventry.ac.uk/~bookshop/v1.1/index.php/genre/list"
        print(urlPath)

        guard let url = URL(string: urlPath) else { return }

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            do {
                if let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary {
                    let results = jsonResult["genres"] as! NSArray
                    print(results)
                    completion(results)
                }
            } catch {
                //Catch Error here...
            }
        }
        task.resume()
    }

Вы можете вызвать эту функцию, как показано ниже. Простой

getGenres { (array) in
    // Do operation with your array
}
0
задан Bulu 13 July 2018 в 13:37
поделиться

1 ответ

Переместите delaySubscription перед вызовом retry. Операторы RxJava работают вверх, поэтому ваша задержка применяется к исходной подписке на повторную попытку, но не к дополнительной подписке в случае ошибки, поскольку повторная попытка только знает, что существует вверх по течению.

0
ответ дан Kiskae 17 August 2018 в 12:42
поделиться
  • 1
    Спасибо за ваш ответ. Но заметили, что карта не будет вызвана ошибкой, но я бы хотел назвать карту, так как я XXX динамический. Я рассчитываю на основе того, как долго длится сетевой вызов. Если сетевой вызов занимает больше времени, значение XXXX будет намного короче – Bulu 13 July 2018 в 21:37
Другие вопросы по тегам:

Похожие вопросы: