Если dataTaskPublisher имеет не ноль данных, тогда какой тип ошибки? - PullRequest
0 голосов
/ 12 ноября 2019

До этого с

URLSession.shared.dataTask(for request: URLRequest) { data, error, response in ... }

Поле data, как и все остальные, может быть равно нулю. Теперь с

URLSession.shared.dataTaskPublisher(for: urlRequest)

комбайна (кортеж (данные, ответ)) больше не являются необязательными типами. Я понимаю, что это означает, что мы должны иметь его как URLError, который мы можем отловить в sink(receiveCompletion: { ... }, но как я могу различить отсутствие данных и любую другую ошибку?

Ответы [ 2 ]

1 голос
/ 19 ноября 2019

Любые данные, предоставленные сервером, будут преобразованы в объект «response» из dataTaskPublisher. Шаблон, который вы обычно используете перед отправкой этих данных подписчику .assign() или .sink(), зависит в основном от вашего кода.

Я предпочитаю использовать здесь оператор tryMap(), который позволяет вам проверять объект ответа,и потенциально преобразует такие вещи, как ответ 404 (который не является состоянием сбоя в конвейере объединения) в сбой. После этого общий шаблон берет данные и запускает их в оператор .decode() для возврата структурированного объекта.

Затем вы можете выбрать способ обработки ошибки - наиболее распространенное решение, которое естьиспользуя .catch(), чтобы заменить значение от издателя тем значением по умолчанию, которое вы хотите отобразить.

Основная деталь использования этого может быть примерно такой:

let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: myURL!)
.tryMap { data, response -> Data in 
            guard let httpResponse = response as? HTTPURLResponse, 
                httpResponse.statusCode == 200 else { 
                    throw TestFailureCondition.invalidServerResponse 
            }
            return data 
}
.decode(type: PostmanEchoTimeStampCheckResponse.self, decoder: JSONDecoder())

это изпример на https://heckj.github.io/swiftui-notes/#patterns-datataskpublisher-trymap, часть бесплатной онлайн-справки Использование Combine .

(там также есть более подробная информация об использовании catch () для устранения ошибки из dataTaskPublisher наhttps://heckj.github.io/swiftui-notes/#patterns-oneshot-error-handling)

0 голосов
/ 12 ноября 2019

Эта строка:

URLSession.shared.dataTaskPublisher(for: urlRequest)

дает вам издателя с Output, являющимся кортежем (Data, URLResponse) и Failure типа URLError.

, на этом этапе вы можетеиспользуйте

.mapError()

, если вы хотите отобразить это значение на свой собственный тип ошибки или обработать его каким-либо образом, вы также можете проигнорировать его и применить:

.catch()

кконец вашей цепочки операций для обработки всех ошибок (или просто их игнорирования) за один раз.

...