开发者社区 问答 正文

翠鸟引起主螺纹问题

因此,该应用程序在测试模式下工作,但一旦我去构建发布,我就得到了这个主要线程问题。

UIImageView.image must be used from main thread only

根据错误,我没有在主线程上调用什么,但是它抛出的线程错误所在的行是空的(见屏幕快照)。

所以我只能猜他们说的是一行下面的代码?

https://i.stack.imgur.com/B0HME.png

电码

@objc func nowplaying(){ let jsonURLString = "https://api.drn1.com.au/station/playing" guard let feedurl = URL(string: jsonURLString) else { return }

              URLSession.shared.dataTask(with: feedurl) { (data,response,err)
                  in

                  guard let data = data else { return }

                  do{
                      let nowplaying = try JSONDecoder().decode(Nowplayng.self, from: data)

                      nowplaying.data.forEach {

                          DispatchQueue.main.async {


                          self.artist.text = nowplaying.data.first?.track.artist
                          self.song.text = nowplaying.data.first?.track.title

                          }


                          print($0.track.title)

                          if var strUrl = nowplaying.data.first?.track.imageurl {

                              strUrl = strUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
                              self.imageurl.kf.setImage(with: URL(string: strUrl), placeholder: nil)

                            //MusicPlayer.shared.nowplaying(artist:  $0.track.artist, song: $0.track.title, cover:strUrl)
                            MusicPlayer.shared.getArtBoard(artist: $0.track.artist, song: $0.track.title, cover:strUrl)
                          }


                     }

我只能猜测这是因为翠鸟想要一张装填的照片什么的。但不清楚?

展开
收起
游客5akardh5cojhg 2019-12-15 16:42:06 556 分享 版权
阿里云 AI 助理回答

根据您提供的错误信息和代码片段,问题在于您在非主线程上尝试设置UIImageViewimage属性。SwiftUI中的视图更新必须在主线程(也称为主线程或UI线程)上执行,以确保界面操作的安全性与一致性。

您的代码中已经使用了DispatchQueue.main.async来确保部分代码在主线程上执行,但看起来可能还有一些地方没有正确地包裹在这个异步块内。从截图来看,直接指出哪一行导致问题确实有难度,因为错误指向的是一个空白行。不过,基于错误信息和代码逻辑,问题很可能是出在对self.imageurl.kf.setImage(with: URL(string: strUrl), placeholder: nil)这一调用上。

Kingfisher库(通过.kf.setImage方法)用于异步加载和缓存图片,虽然它内部处理了很多并发细节,但是调用它的上下文仍然需要确保是在主线程。由于您的网络回调在子线程执行,如果没有明确地将其包裹在主线程的调度中,就可能导致这个错误。

为了解决这个问题,请确保您使用Kingfisher设置图片的代码也在主线程上执行。修改如下:

// 确保这一部分也在主线程执行
DispatchQueue.main.async {
    if var strUrl = nowplaying.data.first?.track.imageurl {
        strUrl = strUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        self.imageurl.kf.setImage(with: URL(string: strUrl), placeholder: nil)
        //MusicPlayer.shared.nowplaying(artist:  $0.track.artist, song: $0.track.title, cover:strUrl)
        MusicPlayer.shared.getArtBoard(artist: $0.track.artist, song: $0.track.title, cover:strUrl)
    }
}

这样可以确保即使在异步任务完成时,对UI的任何更新都会被安全地安排在主线程上执行,从而避免“UIImageView.image must be used from main thread only”这样的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: