gpt4 book ai didi

ios - 如何判断一条语句是否需要放在DispatchQueue.main.async中?

转载 作者:搜寻专家 更新时间:2023-10-31 22:17:33 24 4
gpt4 key购买 nike

我正在尝试在 viewDidLoad 中获取 subview 的绑定(bind)大小:(canvas.bounds)

最初我没有使用 DispatchQueue.main.async 包装器,并且没有正确返回大小。所以通过实验,我将语句包装在主线程队列中。然后它起作用了。

我知道有一个指南说“UI相关操作需要放在主线程”。但这如何转化为实际的编码经验法则:

  1. 如果我只是查询一个 UI 属性,比如获取边界大小,我是否需要将它包装在主线程队列中吗?
  2. 如果我要更改 UI属性(property),例如改变边界大小,我需要把它包在里面吗主线程队列? (我想可能是的)

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // stack views
    view.addSubview(photoView)
    view.addSubview(canvas)

    DispatchQueue.main.async {
    self.canvas.startPoint = CGPoint.zero
    self.canvas.endPoint = CGPoint(x: self.canvas.bounds.width / 2.0, y: self.canvas.bounds.height)

    self.canvas.setNeedsDisplay()
    }

实际上,这引出了我自然而然想问的另一个问题:必须在 dispatch main 中包装代码看起来“不干净”。如果你必须包装它,这是否意味着“viewDidLoad”不是正确的生命周期?应该有一个不需要 dispatch main wrapper 的更合适的生命周期?

最佳答案

您的问题是 viewDidLoad 不是获取任何大小的正确位置。太早了。

使用 DispatchQueue.main.async 只是将代码延迟到足以更新大小(可能)。

正确的解决方案是在正确的位置获取大小。使用 viewDidAppearviewDidLayoutSubviews

关于ios - 如何判断一条语句是否需要放在DispatchQueue.main.async中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com