簡體   English   中英

如何確定是否需要將語句放在DispatchQueue.main.async中?

[英]How to decide if a statement needs to be placed in DispatchQueue.main.async?

我試圖在viewDidLoad中獲取子視圖的綁定大小:( canvas.bounds

最初我沒有使用DispatchQueue.main.async包裝器,並且未正確返回大小。 所以通過實驗,我將語句包裝在主線程隊列中。 然后它奏效了。

我知道有一條准則說“UI相關操作需要放在主線程中”。 但是,這又如何轉化為實際的編碼經驗法則:

  1. 如果我只是查詢UI屬性,比如獲取邊界大小,我是否需要將其包裝在主線程隊列中?
  2. 如果我要更改UI屬性,例如更改邊界大小,是否需要將其包裝在主線程隊列中? (可能是的,我猜)

     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'不是正確的生命周期? 應該有一個更合適的生命周期,不需要派遣主包裝?

您的問題是viewDidLoad不是獲取任何大小的正確位置。 太早了。

使用DispatchQueue.main.async只是將代碼延遲到足以使大小更新(可能)。

正確的解決方案是將尺寸放在適當的位置。 使用viewDidAppearviewDidLayoutSubviews

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM