繁体   English   中英

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

[英]Can I turn off Main Thread Checker, and use UIKit on off main thread?

我有一个关于在后台线程上调用 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)
                }
            }
        }

[断言] 不支持使用 UIKit 视图自定义 API 关闭主线程。 -setBackgroundColor:发送到 >

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

为了妥善解决这个问题,需要将高计算成本的 function 放在后台线程中,并且在调用任何 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
            }

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM