//在子线程里执行图片下载,因为下载耗时会卡住界面
DispatchQueue.global(qos: .userInitiated).async {
//contentsOf 默认是从URL读取数据
if let imageData = try? Data(contentsOf: url){
//检查一下是否还是用户拖入的图
if url == self.emojiArt.backgroundURL{
//下载成功后在主线程里执行替换背影视图
DispatchQueue.main.async {
self.backgroundImage = UIImage(data: imageData)
}
}
}
}
if let url = self.emojiArt.backgroundURL{
fetchImageCancellable.cancel()//下次抓取前,先取消上次的抓取
fetchImageCancellable = URLSession.shared.dataTaskPublisher(for: url)
.map{ data,URLResponse in UIImage(data: data) }
.receive(on: DispatchQueue.main)//在主线程上执行绘图工作
.replaceError(with: nil)
.assign(to: .backgroundImage, on: self)
}
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/140
《【SwiftUI进阶】多线程处理》的网友评论(0)