SwiftUI/onAppearは処理の完了後にViewが表示されるが、taskは非同期処理を呼ぶだけ呼んでViewを表示する
環境
code:sh
$xcodebuild -version
Xcode 15.0.1
Build version 15A507
モチベーション
/icons/hr.icon
onAppearはViewが表示される前に処理を行う
裏を返すと、onAppearの処理が終わらなければViewが表示されない模様
以下のコードだとシミュレーターでは処理が重すぎて Text("Test") が表示されない (= onAppearの処理が終わらないため)
code:swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Test")
.onAppear {
// 同期的な重い処理(*1)
for i in 0..<100000000 {
print(i)
}
}
}
}
一方でtaskはViewが表示される前に非同期なTaskとして処理を呼び出すだけであって、処理の完了は待たない
A closure that SwiftUI calls as an asynchronous task before the view appears.
以下のコードだとtaskが呼ばれて、Text("Test") が表示される。taskの処理は動き続けている。
code:swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Test")
.task {
for i in 0..<100000000 {
print(i)
}
}
}
}
/icons/hr.icon
*1: 標準出力はN=2だが色々な言語で重い処理という認識。ログ吐かせるのをやめたら動作が軽くなった、という事例に出くわしたことがある。