Swift 在调用URLSession后,我无法执行其他工作
我只想在音频开始播放时隐藏imageviewSwift 在调用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()
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()