[英]Is using Task.detached a best practice and correct approach, to make sure the Task is executed in non-main thread?
[英]Default priority of Task.detached
當您使用detached(priority:operation:)創建一個分離任務但將priority
設置為 nil 時,iOS 分配什么優先級?
例如,假設照片 output 處理程序調用這樣的演員:
class PhotoViewController: UIViewController {
func photoOutput(_ photoOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let photoWithContext = someCallToMainActor(photo)
Task.detached {
let result = async someCallToAnotherActor(photoWithContext)
async anotherCallToMainActor(result)
}
}
}
detached(priority:operation:) 的文檔提到了優先級,“你需要通過一個分離的任務手動處理這些考慮。” 由於分離的任務不是子任務,我沒有得到“子任務繼承父任務的優先級”的功能。
我意識到我可以明確指定優先級。 盡管如此, detached(priority:operation:) 允許優先級為零可能是有原因的,並且人們會期望一個定義良好的語義。 是否有任何規則來管理分離任務的優先級?
對於子任務,任務的優先級是從父任務繼承的,對於分離任務和父任務,如果提供的優先級為nil
,則使用TaskPriority.medium
作為優先級。
TL&DR; 沒有指定優先級的分離任務最終具有.medium
優先級,至少在編寫此答案時這是正確的。 未來可能會發生變化,但不確定這一變化的可能性有多大。
Swift 的眾多優點之一是它是開源的,因此我們可以看看引擎蓋下發生了什么。
如果我們看一下Task.detached()實現,我們可以看到以下代碼:
public static func detached(
priority: TaskPriority? = nil,
operation: __owned @Sendable @escaping () async -> Success
) -> Task<Success, Failure> {
#if compiler(>=5.5) && $BuiltinCreateAsyncTaskInGroup
// Set up the job flags for a new task.
let flags = taskCreateFlags(
priority: priority, isChildTask: false, copyTaskLocals: false,
inheritContext: false, enqueueJob: true,
addPendingGroupTaskUnconditionally: false)
優先級被傳遞給taskCreateFlags() function,目前看起來像這樣:
func taskCreateFlags(
priority: TaskPriority?, isChildTask: Bool, copyTaskLocals: Bool,
inheritContext: Bool, enqueueJob: Bool,
addPendingGroupTaskUnconditionally: Bool
) -> Int {
var bits = 0
bits |= (bits & ~0xFF) | Int(priority?.rawValue ?? 0)
...
}
因此,如果priority
參數為 nil,則表示優先級的任務標志的第一個字節將為零。
現在,如果我們繼續挖掘,我們會到達編譯器區域,在某個時候我們會到達Task.cpp:755 ,它的內容如下
if (isUnspecified(basePriority)) {
basePriority = JobPriority::Default;
}
,因此JobPriority::Default對應於值0x15
,無論是否巧合,正如其他人所注意到的那樣,它對應於.medium
任務優先級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.