因此,该应用程序在测试模式下工作,但一旦我去构建发布,我就得到了这个主要线程问题。
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)
}
}
我只能猜测这是因为翠鸟想要一张装填的照片什么的。但不清楚?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的错误信息和代码片段,问题在于您在非主线程上尝试设置UIImageView
的image
属性。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”这样的错误。