Проблема экспорта данных JSON в текстовое поле - PullRequest
0 голосов
/ 10 мая 2019

Я использую протокол JSONDecoder для получения данных из базы данных.

Все с кодом ниже работает как положено, но я не могу car.driver_name экспортировать в текстовое поле с именем contacttextField

Я попытался установить self.contacttextField = car.driver_name с плохими результатами. По какой-то причине для отображения текста из декодированного JSON требуется около минуты, а отладчик говорит:

10  Foundation                          0x00000001d67a8908 <redacted> + 740
11  Foundation                          0x00000001d689ecec <redacted> + 272
12  libdispatch.dylib                   0x0000000102a436f0 _dispatch_call_block_and_release + 24
13  libdispatch.dylib                   0x0000000102a44c74 _dispatch_client_callout + 16
14  libdispatch.dylib                   0x0000000102a47ffc _dispatch_continuation_pop + 524
15  libdispatch.dylib                   0x0000000102a47458 _dispatch_async_redirect_invoke + 628
16  libdispatch.dylib                   0x0000000102a55dc8 _dispatch_root_queue_drain + 372
17  libdispatch.dylib                   0x0000000102a567ac _dispatch_worker_thread2 + 156
18  libsystem_pthread.dylib             0x00000001d5a591b4 _pthread_wqthread + 464
19  libsystem_pthread.dylib             0x00000001d5a5bcd4 start_wqthread + 4

Ниже приведен код, который я использую:

struct FacilityInfo: Decodable {
    let driver_name: String
}

class infoViewController: UIViewController {
    @IBOutlet weak var usernameTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "https://example.com/example/test.php")!

        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            // ensure there is no error for this HTTP response
            guard error == nil else {
                print ("error: \(error!)")
                return
            }

            // ensure there is data returned from this HTTP response
            guard let data = data else {
                print("No data")
                return
            }

            // Parse JSON into array of Car struct using JSONDecoder

            guard let cars = try? JSONDecoder().decode([FacilityInfo].self, from: data) else {
                print("Error: Couldn't decode data into cars array")
                return
            }

            for car in cars {
                print("car name is \(car.driver_name)")
                self.usernameTextField.text = cars.driver_name
            }
        }

        task.resume()

1 Ответ

0 голосов
/ 10 мая 2019

URLSession.dataTask выполняет свое закрытие в фоновом потоке, но все обновления пользовательского интерфейса должны происходить из основного потока.Поэтому вам нужно выполнить вызов usernameTextField.text в главном потоке.

...
guard let cars = try? JSONDecoder().decode([FacilityInfo].self, from: data), let firstCar = cars.first else {
    print("Error: Couldn't decode data into cars array")
    return
}
DispatchQueue.main.async {
    self.usernameTextField.text = firstCar.driver_name
}

Также имейте в виду, что cars - это массив, поэтому вы должны получить доступ к одному из его элементов, который имеет driver_name и присвойте это свойству text текстового поля.В качестве примера я назначил значение из первого элемента, но изменил его в соответствии с вашими требованиями.

Вы должны также соблюдать соглашение об именах Swift, которое для имен переменных является lowerCamelCase (driverName).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...