我可以关闭主线程检查器,并在关闭主线程上使用UIKit吗?

我有一个关于在后台线程上调用UI API的问题。

我需要视图信息来保存视图,例如view.center,view.transform,view.frame.width。

此编码需要在后台线程而非主线程上执行。

由于此编码逻辑具有很高的计算成本,因此会影响对用户交互(如Apple Pencil输入)的响应。

所以我关闭了主线程检查器,并在后台线程上调用UI API。

我不需要任何UI更新,只需要收集UIView,UITextView,CALayer的信息。

在这种情况下,在后台线程上调用UI API是否有任何可能的问题?

有一些警告消息,但是在调试模式下我找不到任何问题。

请提供任何有关保存视图信息的正确方法的建议。

谢谢。

    func pendingSave(pending: Bool) {
        if let save = self.pendingRequestSave {
            save.cancel()
        }

        if !pending {
            self.save(workItem: nil)
            return
        }

        self.pendingRequestSave = DispatchWorkItem(qos: .userInitiated,flags: .enforceQoS) { [weak self] in
            self?.save(workItem: self?.pendingRequestSave)
        }

        //savingQueue is serial DispatchQueue
        DrawingViewController.savingQueue.asyncAfter(deadline: .now() + .seconds(1),execute: self.pendingRequestSave!)
    }

    func save(workItem: DispatchWorkItem?) {
            let encoder = JSONEncoder()
            let jsonData = try! encoder.encode(self.canvasView)
            if workItem == nil || !(workItem!.isCancelled) {
                DispatchQueue.main.async {
                    MonthService.save(dateId: self.curMonthInfo,contents: jsonData)
                }
            }
        }

[Assert]不支持在主线程上使用UIKit视图定制API。 -setBackgroundColor:发送到>

marxxxx 回答:我可以关闭主线程检查器,并在关闭主线程上使用UIKit吗?

请注意,不仅需要在主线程中添加UI更新,还需要从主线程中调用所有UI getter和setter,这就是您遇到这些问题的原因。

为了以正确的方式解决该问题,您需要将高计算成本的函数放在后台线程中,并且在调用任何UI getter / setter时,您需要将其自身放在主线程中

只是一个建议,请始终启用主线程检查器,因为它可以节省大量时间,以指示逻辑中的问题是否存在。

例如:

var array = [String]()

    //High computational block,use operation queue to create a thread
    OperationQueue.init().addOperation {
        for string in array{

            //UI Getter/Setter,use main thread queue
            OperationQueue.main.addOperation {
                textLabel.text = string
            }

        }
    }
本文链接:https://www.f2er.com/3116891.html

大家都在问