我對迅速取消任務有點不確定。我的問題是:
如果一個任務到達它的回傳線(在這個例子中,Line 4),這是否意味著它會被自動取消?(從而釋放記憶體 之前被任務占用的任何使用的執行緒?)
someBlock {
Task<Bool, Never> {
await doSomeWork()
return true // Line 4
}
}
作為后續,如果我們呼叫.taskSwiftUI 會View怎樣?有什么改變嗎?
SomeView
.task {
await doSomeWork()
}
感謝您的時間!
uj5u.com熱心網友回復:
如果一個任務到達它的回傳行(在這個例子中,第 4 行),這是否意味著它會被自動取消
不,這意味著它將自動以良好的順序結束。取消任務是非常不同且專業的事情。它們都是完成任務的兩種方式,但在這種相似性中,它們實際上是彼此對立的。
這確實意味著 Task 使用的執行緒現在可以免費使用,但這并不像看起來那么重要,因為它await 也釋放了 Task 使用的執行緒。這就是重點;async/await它不是執行緒系結的。Task 不與單個執行緒對齊,就像 DispatchQueue 一樣;換句話說,我們傾向于使用佇列和執行緒作為彼此松散的等價物,但是對于任務,情況并非如此。
至于釋放什么記憶體,就看保留什么記憶體了。給出的代碼太“偽”,無法得出任何結論。但是基本上是的,您對此的心理描繪是正確的:任務有自己的生命,并且在它活著的同時,它的代碼會繼續保留它強烈參考的任何內容,然后在它結束時(無論是通過以良好的順序完成)或通過取消)任務的生命結束(如果您沒有在其他地方保留它),因此任務的代碼保留的任何內容都會結束。
有什么改變嗎
根據 Apple 的說法,該.task修飾符創建“一個生命周期與 ... 視圖相匹配的異步任務”。所以我會說,是的:Task 不再只是擁有自己的獨立生命,而是保留在幕后(以便 SwiftUI 框架可以在 View 不存在時取消它),所以無論它的代碼有什么強烈的參考都將保留。
另一方面,這可能不是非常重要。這取決于您是否使用參考型別。對值型別(例如視圖)的參考沒有那種記憶體管理含義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480814.html
上一篇:@Binding值更改時更新UIView(在UIViewRepresentable內)
下一篇:UITextView富文本編輯
