程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift • 如何从视图的初始化程序启动后台任务?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Swift • 如何从视图的初始化程序启动后台任务??

开发过程中遇到Swift • 如何从视图的初始化程序启动后台任务?的问题如何解决?下面主要结合日常开发的经验,给出你关于Swift • 如何从视图的初始化程序启动后台任务?的解决方法建议,希望对你解决Swift • 如何从视图的初始化程序启动后台任务?有所启发或帮助;

我正在处理 SwiftUI App遇到问题

我有一个视图 (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@
@H_450_65@

大佬总结

以上是大佬教程为你收集整理的Swift • 如何从视图的初始化程序启动后台任务?全部内容,希望文章能够帮你解决Swift • 如何从视图的初始化程序启动后台任务?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。