Viewの更新はメインスレッドから行うべき?
知りたいこと
Appleの動画で、asyncにviewを更新するコードが気になって、詳細が知りたい。
この動画の20分あたりで以下のコードが出てきます。
私の理解としては、Taskは同期的な文脈の中で非同期的な文脈を作り出すもので、その内部では非同期的な処理をawaitで呼び出せる、というふうに捉えています。
そして非同期的な文脈では、コードの1行1行がどのスレッドで実行されるかは不確定で、メインスレッド以外から呼ばれる可能性もあると見聞きしました。
以下のコードではどのようにisSavingへの代入がメインスレッドから行われることを保証しているのでしょうか?
struct SavePhotoButton: View {
var photo: SpacePhoto
@State private var isSaving = false
var body: some View {
Button {
Task {
isSaving = true //ここ1
await photo.save()
isSaving = false//ここ2
}
} label: {
Text("Save")
.opacity(isSaving ? 0 : 1)
.overlay {
if isSaving {
ProgressView()
}
}
}
.disabled(isSaving)
.buttonStyle(.bordered)
}
}