Swift 在调用URLSession后,我无法执行其他工作

Swift 在调用URLSession后,我无法执行其他工作,swift,urlsession,Swift,Urlsession,我只想在音频开始播放时隐藏imageview URLSession.shared.dataTask(with: serverUrl!) { [self] (data, res, error) in do { self.myMediaPlayer1 = try AVAudioPlayer(data: data!) self.myMediaPlayer1.prepareToPlay()

我只想在音频开始播放时隐藏imageview

URLSession.shared.dataTask(with: serverUrl!) { [self] (data, res, error) in
            do {
                self.myMediaPlayer1 = try AVAudioPlayer(data: data!)
                self.myMediaPlayer1.prepareToPlay()
                self.myMediaPlayer1.delegate = self
                self.SetSessionPlayerOn()
                self.loading_img.isHidden = true    // not work til audio finish playing 
                print("imageview should be hidden now")
                self.myMediaPlayer1.play()
            }catch let error {
                print("error!!!!!!!!!!")
            }
        }.resume()
我可以打印atone,但只有在媒体播放器完成播放后,图像视图才会隐藏

更新 现在它起作用了。感谢Tushar


首先,您应该只在主线程上更新UI。因此,您必须在dataTask中添加以下代码。之后,您应该更新视图的布局以更新UI。所以代码应该是这样的:

URLSession.shared.dataTask(with: serverUrl!) { [self] (data, res, error) in
        do {
            self.myMediaPlayer1 = try AVAudioPlayer(data: data!)
            self.myMediaPlayer1.prepareToPlay()
            self.myMediaPlayer1.delegate = self
            self.SetSessionPlayerOn()
            DispatchQueue.main.async {
                self.loading_img.isHidden = true
                self.view.layoutIfNeeded()
                print("imageview should be hidden now")
            }
            self.myMediaPlayer1.play()
        }catch let error {
            print("error!!!!!!!!!!")
        }
    }.resume()

将UI相关任务放在主线程上。谢谢。我确实喜欢这个问题。答案很好,除了
打印(“imageview现在应该隐藏”)
应该在异步调用中。调用print语句时,要设置
加载的代码\u img.ishiden=true
尚未执行。你是对的,我没有看到那里的打印lol
URLSession.shared.dataTask(with: serverUrl!) { [self] (data, res, error) in
        do {
            self.myMediaPlayer1 = try AVAudioPlayer(data: data!)
            self.myMediaPlayer1.prepareToPlay()
            self.myMediaPlayer1.delegate = self
            self.SetSessionPlayerOn()
            DispatchQueue.main.async {
                self.loading_img.isHidden = true
                self.view.layoutIfNeeded()
                print("imageview should be hidden now")
            }
            self.myMediaPlayer1.play()
        }catch let error {
            print("error!!!!!!!!!!")
        }
    }.resume()