Warm tip: This article is reproduced from serverfault.com, please click

Swift

发布于 2020-11-27 21:31:51

I am trying to create an iOS app to get data from API that I want to show the user in a Label.

So far I have this:

func getJoke(completion: @escaping (ChuckNorrisResponse) -> ()) {
        URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in
            guard let data = data, error == nil else {
                print("Something fucked up")
                return
            }
            
            var result: ChuckNorrisResponse?
            do {
                result = try JSONDecoder().decode(ChuckNorrisResponse.self, from: data)
            } catch {
                print("Fucked up to convert \(error.localizedDescription)")
            }
            
            guard let joke = result else {
                return
            }
            
            completion(joke)
        }.resume()
    }

And in the ViewController

func setNewJoke() {
        jokesProvier.getJoke { joke in
            self.JokeLabel.text = joke.value
        }

But it doesn't like that I try to edit the text in the Label inside the closure. It shows error - UILabel.Text must be used from main thread only.

I cannot find anywhere how should I do this properly so it works.

Thanks in advance

Questioner
Snackerino
Viewed
0
Aaron Brager 2020-11-28 06:13:47

I'd recommend calling the completion handler on the main thread. So instead of

completion(joke)

do

DispatchQueue.main.async { completion(joke) }