大佬教程收集整理的这篇文章主要介绍了Swift • 如何从视图的初始化程序启动后台任务?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个视图 (file Icon
)。一个 Data
对象被传递给这个视图。要创建 file Icon
,必须将数据转换为 pdfdocument,并且必须从第一个文档页面呈现图像。
想法:由于这是一项繁重的任务,并且有显示多个文件图标的视图(例如同时创建 20 个文件图标),因此计划是使用某种占位符创建 file Icon
,在后台队列中渲染图像,并在完成后更改显示的图像。
struct fileIcon: VIEw {
let data: Data
@State private var image: UIImage?
init(for data: Data) {
self.data = data
renderImage() // Initiate the BACkground Task
}
var body: some VIEw {
Group {
if let safeImage = image {
// Some Placeholder VIEw
} else {
Image(uiImage: safeImagE)
}
}
}
private func renderImage() {
dispatchQueue.global(qos: .userInitiated).async {
// Heavy Logic
dispatchQueue.main.async {
image = renderedImage
}
}
}
}
问题:
如您所见,我正在 BACkground Task
内启动 VIEw's Initializer
。 Xcode 不会给出任何错误。但是,在运行此代码时,占位符视图一直显示,并且没有切换到实际渲染的图像。
在 renderImage()
内调用 .onAppear()
时,占位符会在一段时间后被渲染图像替换。
问题:如何从 BACkground Task
发起 VIEw's Initializer
?
这是一个简单的演示(因为您想在 init
中执行此操作,但是,由于我不了解您的情况,因此最好将其移动到单独的方法中并显式调用)
使用 Xcode 12.5 / iOS 14.5 测试
struct DemoBACkgroundTaskView: View {
class ViewModel: ObservabLeobject {
@Published var finished = false
init() {
print("Init") // test called once
// set up once performed BACkground task
DispatchQueue.global(qos: .BACkground).async {
sleep(10) // do your long task here
DispatchQueue.main.async { [weak self] in
self?.finished = true
}
}
}
}
@StateObject private var vm = ViewModel()
var body: some View {
Text(vm.finished ? "Done" : "Loading...")
}
}
@H_450_65@
以上是大佬教程为你收集整理的Swift • 如何从视图的初始化程序启动后台任务?全部内容,希望文章能够帮你解决Swift • 如何从视图的初始化程序启动后台任务?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。