Лучший способ сделать запрос вызова с SwiftUI - это использовать Combine.
Сначала вам нужно будет создать модель вашего JSON объекта, который вы хотите получить обратно:
import Foundation
//MARK: - Your object to retrieve from JSON
struct Doctor: Codable, Identifiable {
let id = UUID()
let patients: [Patients]
}
struct Patients: Codable {
let id: String
let name: String
let phone: String
}
Затем вы создадите класс, который будет обрабатывать ваши JSON запросы, используя Объедините (я добавил плюс для вас, чтобы обработать любую ошибку ответа):
import Foundation
import Combine
class Network {
// Handle your request errors
enum Error: LocalizedError {
case invalidResponse
case addressUnreachable(URL)
var errorDescription: String? {
switch self {
case .invalidResponse:
return "The server responded with garbage."
case .addressUnreachable(let url):
return "\(url.absoluteString) is unreachable."
}
}
}
// Add your url
let urlRequest = URL(string: "your url")!
// Networking on concurrent queue
let networkQueue = DispatchQueue(label: "Networking",
qos: .default,
attributes: .concurrent)
// Combine network call (This replace your previous code)
func downloadPatients() -> AnyPublisher<Doctor, Error> {
URLSession.shared
.dataTaskPublisher(for: urlRequest)
.receive(on: networkQueue)
.map(\.data)
.decode(type: Doctor.self, decoder: JSONDecoder())
.mapError { (error) -> Network.Error in
switch error {
case is URLError:
return Error.addressUnreachable(self.urlRequest)
default:
return Error.invalidResponse
}
}
.eraseToAnyPublisher()
}
}
И теперь, в вашем файле SwiftUI, где вам нужны эти значения, вам просто нужно вызвать функцию downloadPatients () и использовать возвращаемые данные по мере того как вы sh:
import SwiftUI
let networkRequest = Network()
//MARK: - Call this function where you want to make your call
func loadPatients() {
_ = networkRequest.downloadPatients()
.sink(
receiveCompletion: {
print("Received Completion: \($0)") },
receiveValue: { doctor in
// doctor is your response and [0].name is your first patient name
print(doctor.patients[0].name) }
)
}