долгая инициализация UILabel

358
17 января 2017, 22:43

Существует простой код, который делает POST - запрос яндекса-переводчика API. Получается ответ - переведенный текст. Однако при получения ответа (и даже вывода ответа на консоль) инициализация UILabel происходит очень долго, спустя несколько секунд. Как это устранить? Почему это происходит?

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!{
        didSet{
            textField.delegate = self
            textField.text = textToTranslate
        }
    }
    @IBOutlet weak var label: UILabel!{
        didSet{
            print("didSet")
        }
    }
    var textToTranslate: String?{
        didSet{
            TranslateTheText()
        }
    }
    private func TranslateTheText(){
        var request = URLRequest(url: URL(string: "https://translate.yandex.net/api/v1.5/tr.json/translate")!)
        request.httpMethod = "POST"
        let key = "trnsl.1.1.20170105T183003Z.a061e235d7abde36.51b76f0ff88678b7d1cdd254edd2951b4fb00dbf"
        let postString = "key=" + key + "&text=" + textToTranslate! + "&lang=en-ru"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { [weak weakSelf = self] data, response, error in
            guard let data = data, error == nil else {               // check for fundamental networking error
                print("error=\(error)")
                return
            }
            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }
            var parsedObject: Any?
            do {
                parsedObject = try JSONSerialization.jsonObject(with: data,options: JSONSerialization.ReadingOptions.allowFragments)
            }
            catch let error {
                print ("error: \(error)")
            }
            if let source = parsedObject as? [String: Any]{
                if let text = source["text"] as? Array<String>{
                    for temp in text{
                        print(temp)
                        weakSelf?.label.text = temp
                    }
                }
            }
            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(responseString)")
        }
        task.resume()
    }
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        textToTranslate = textField.text
        return true
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
Answer 1

Потому что Вы обновляете текст в background потоке. Просто добавьте здесь:

if let source = parsedObject as? [String: Any]{
    if let text = source["text"] as? Array<String>{
        for temp in text{
            print(temp)
            DispatchQueue.main.async {
                weakSelf?.label.text = temp
            }
        }
    }
}
READ ALSO
Пошаговая анимация

Пошаговая анимация

Нужно чтобы при щелчке внешний блок появлялся с помощью функции slideDown, и только после его появления внутренний абзац появлялся c помощью анимации

301
HTML: перебор произвольных DOM-элементов клавишей Tab

HTML: перебор произвольных DOM-элементов клавишей Tab

Допустим, я хочу чтобы чтобы на любые DOM-элементы (например, на <div>ы указанного класса) можно было наводиться клавишей Tab, как это можно делать...

337
Нужна помощь в построении массива меню WordPress

Нужна помощь в построении массива меню WordPress

У меня есть вот такая верстка:

272
Авторизация в СУБД MySQL в связке с [WPF + MVVM + Entity Framework]

Авторизация в СУБД MySQL в связке с [WPF + MVVM + Entity Framework]

Есть приложение WPF, разделенное на три части согласно паттерну MVVMПриложение работает с БД MySql средствами Entity Framework 6

436