簡體   English   中英

CADisplayLink 回調是否始終在主線程上運行?

[英]Is CADisplayLink callback always runs on the main thread?

我在網上和文檔中都找不到任何直接的答案。 如果我使用以下內容設置CADisplayLink

 let displayLink = CADisplayLink(target: self, selector: #selector(updateShimmer))
 displayLink.add(to: .current, forMode: .common)

@objc func updateShimmer() {
   print(Thread.isMainThread)
}

我說實話了。 我知道我可以將它包裝在DispatchQueue.main但我想知道,它是否總是在主隊列上調度? 還是我應該把它包起來?

您不需要將顯示鏈接處理程序中的代碼手動分派到主線程。 添加到特定運行循環的計時器和顯示鏈接將始終在與該運行循環關聯的線程上運行。 有關更多信息,請參閱線程編程指南:運行循環

最重要的是,如果您add(to:forMode:)主運行循環中,則主運行循環始終在主線程上運行。

話雖如此,如果您想確保它始終在主線程上運行,我建議明確並將其添加到.main ,而不僅僅是.current 這消除了任何歧義:

let displayLink = CADisplayLink(target: self, selector: #selector(updateShimmer(_:)))
displayLink.add(to: .main, forMode: .common)

請注意,我還調整了updateShimmer的簽名以接受參數。 顯示鏈接將傳遞給它。 在方法中包含該引用通常很有用。 而且,無論如何,它使一個人的代碼更加不言而喻:您現在只需看一眼這個方法就會明白這是一個顯示鏈接處理程序:

@objc func updateShimmer(_ displayLink: CADisplayLink) {
     ...
}

暫無
暫無

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

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