[英]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.