В настоящее время я создаю приложение SwiftUI и использую сетевую библиотеку от github ( GitHub / Squid ) для реализации вызовов API.
Работает нормально, за исключением случаев, когда запрос не выполняется, тогда внутренние отладочные сообщения библиотеки указывают на ошибку (404 в моем тесте), но подписчик Combine никогда не получает сигнал завершения.
Я создал новый запрос, который попытается извлечь и декодировать пользователей "jsonplaceholder.typicode.com".
import Foundation
import Squid
struct GetUsersFromMockApiRequest: JsonRequest {
typealias Result = [User]
var routes: HttpRoute {
["users"]
}
}
Пользователь - это простая структура:
struct User: Decodable {
let id: Int
let username: String
let name: String
}
В моем файле ApiRequestManager.swift я объявил функцию для запроса планирования:
public func getUsersFromMockApi() -> Response<GetUsersFromMockApiRequest> {
return GetUsersFromMockApiRequest().schedule(with: ApiService(apiUrl: "jsonplaceholder.typicode.com"))
}
И, на мой взгляд, где я хочу вызвать API, у меня есть отменяемый набор и экземпляр ApiRequestManager.
@State private var cancellableSet: Set<AnyCancellable> = []
private let requestManager = ApiRequestManager()
Теперь последним шагом является вызов функции нажатием кнопки, которая выполняет следующий код:
self.requestManager.getUsersFromMockApi()
.print("Debug:")
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("ApiCall failed.")
case .finished:
print("ApiCall finished.")
}
}) { result in
print("Received users from apiCall: \(result)")
}
.store(in: &cancellableSet)
Если запрос API успешен, все работает в порядке. Но как только он обнаружит любую ошибку, приемник вообще получит какие-либо сигналы / завершение.
Я пытался напечатать каждое сообщение, полученное подписчиком, breakOnError, а также пошагово следовал за библиотекой, чтобы выяснить, даже выдает ошибку. Он правильно проверяет код ответа HTTP на соответствие принятым кодам состояния в функции schedule () в файле NetworkScheduler.swift и выдает пользовательскую ошибку throw Squid.Error.requestFailed(statusCode: statusCode, response: response.data)
в строке 285.
Однако при отсутствии отладки и объединения Знание, что мне тяжело после броска потом.