[英]How to decide if a statement needs to be placed in DispatchQueue.main.async?
我試圖在viewDidLoad中獲取子視圖的綁定大小:( canvas.bounds
)
最初我沒有使用DispatchQueue.main.async
包裝器,並且未正確返回大小。 所以通過實驗,我將語句包裝在主線程隊列中。 然后它奏效了。
我知道有一條准則說“UI相關操作需要放在主線程中”。 但是,這又如何轉化為實際的編碼經驗法則:
如果我要更改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
只是將代碼延遲到足以使大小更新(可能)。
正確的解決方案是將尺寸放在適當的位置。 使用viewDidAppear
或viewDidLayoutSubviews
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.