Swift 26 SwiftUI同時性および生命周期

SwiftUIの主要長所の一つはビュー、状態プロパティ、Ｏｂｓｅｒｖａｂｌｅオブジェクトと同じ機能を使ってアプリの生命周期変更を正しくて処理する様に必要な複数の作業を自動的に実行することです。

だけど特定生命周期イベントが発生する時、追加的な動作を実行する場合がたまにあります。例えばアフリはビューを`レイアウトvhz`中で現れたり消えれたりする一連の作業を実行しなければならない場合があります。同じようにアプリは値が変更されるたびに一部のコードを実行するとか`ビュー{`が活性化または非活性化される視点を感知しなければならない場合があります。また、`ビュー {`の生命周期が始まれる時に一つ以上非同期作業を始まることが一般的な要求事項になったりします。

そのようなすべての要求事項、またはこの以上はＳｗｉｆｔＵＩで提供するイベント修正者セットを使って満たせることができます。

# 壱　LifecycleDemoプロジェクト生成する
```diff_swift
struct ContentView: View {
    
    var body: some View {
        TabView {
            FirstTabView()
                .tabItem {
                    Image(systemName: "01.cicle")
                    Text("First")
                }
            SecondTabView()
                .tabItem {
                    Image(systemName: "02.cicle")
                    Text("Second")
                }
        }
        .padding()
    }
}
```
![Screenshot 2023-12-07 at 10.52.43 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/71c7bca0-10ef-b754-9d7c-7ae3d464fd60.png)
## 壱・一　ｏｎＡｐｐｅａｒおよびｏｎＤｉｓａｐｐｅａｒ修正者
一番基本的でしばしば使用される`.修正者`は`onAppear()`と`onDisappear()`だ`ビュー {`でその様な修正者を適応すれば`ビュー {`が現れたり消えたりする視点で作業を実行することができます。
`FirstTabView.swift`ファイルで次の様に二つの修正者を`textビュー{`で追加しましょう
```diff_swift
struct FirstTabView: View {
    var body: some View {
        Text("View One")
+            .onAppear(perform: {
+                print("onAppear triggered")
+            })
+            .onDisappear(perform: {
+                print("onDisappeard triggered")
+            })
    }
}
```
## 壱・二 onChange修正者
基本的に.onChange()はアプリ内で状態が変更される時たびに作業を遂行しなければならない時に使われるべきだ。これを作動することを見ると`SecondTabView.swift`ファイルを次の様に編集します。
```diff_swift
struct SecondTabView: View {
    
    @State private var text: String = ""
    
    var body: some View {
        TextEditor(text: $text)
            .padding()
            .onChange(of: text, perform: {value in print("onChange triggered")
            })
    }
}
```
# 弍 ScenePhaseとonChange修正者
ＳｃｅｎｅＰｈａｓｅは現在の画面の状態を保存するためSwiftUIで使用する`@Environment`属性ですＳｃｅｎｅＰｈａｓｅに対する変更事項がonChange()`.修正者`によってモニタリングされる場合には、例えば画面がフォーグラウンドからバッグラウンド転換されるとか活性化、または非活性化される時にアプリは作業を実行します。この技術はすべての`ビュー {`または画面で使われることがありますが、アプリの宣言ぶで適用する時も有用です。
```diff_swift
@main
struct LifecycleDemo1App: App {
+   @Environment(\.scenePhase) private var scenePhase
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        
+      .onChange(of: scenePhase, perform: { phase in
+          switch phase {
+      case .active:
+          print("Active")
+      case .inactive:
+          print("Inactive")
+      case .background:
+          print("backGround")
+      default:
+          print("Unknown scenephase")
+      }
        })
    }
}
```
その様な方法でウィンドウグループで適応すれば、画面の段階はアプリ内の全画面の状態を基でします。言い直して現在活性化された画面があれば、段階が活性で設定されることですべての場面が非活性化された場合に限って非活性化で設定されるだろう。

反面、個別`ビュー {`で適用されば段階状態は`ビュー {`が位置された画面の状態だけを反映する。例えば`.修正者`が次の様にウィンドウグループ代わりにコンテント`ビュー {`で適用されることができます。
```diff_swift
var body: some Scene {
        WindowGroup {
            ContentView()
+                .onChange(of: ScenePhase, perform: { phase in
                    
+                })
        }
```
デバイスまたはシミュレーターであぷりを実行してアプリをバッグラウンドで送る。そしたらコンソールで非活性状態で変更されるあと背景段階で変更されたと表示されるだろう。アプリをもう一度ぷぐらんどで戻したら活性段階で入るだろう。三つの画面段階は次の様に予約できます。
* Active -画面がプグランドであるし、使用者で表示されるし、使用者インタラックションに反応する。
* inactive - 画面がプグランドであるし、使用者で表示されるだけど使用者インタラックションに反応しない。
* background - 使用者に画面が現れない

# 参 同時作業始める
二十四章で「Swift構造化された同時性概要」ではスイフトの構造化された同時性に対する主題に扱ったけど、非同期作業がSwiftUI`ビュー {`のコンテキストでどうやって始まるかは説明しなかった。以前章で説明した全ての技術はＳｗｉｆｔＵＩで作業する時当然に適応することができるものだった。私たちに必要なものは実行するコードをふくまるクロージャーを持っている`ビュー {`の`task()`修正者を呼び出すことです。その様なコードは`ビュー {`が生成される視点から新しい同時作業ないで実行されます。例えば非同期作業を使用して`Text ビュー`で他の文字列を表示するように　FirstTabViewを修正することができます。
```diff_swift
import SwiftUI

struct FirstTabView: View {
    @State var title = "View One"
    
    var body: some View {
        Text(title)
            .onAppear(perform: {
                print("onAppear triggered")
            })
            .onDisappear(perform: {
                print("onDisappeard triggered")
            })
            .task(priority: .background) {
                title = await changeTitle()
            }
    }
    func changeTitle() async -> String {
        sleep(5)
        return "Async task complete"
    }
}
struct FirstTabView_Previews: PreviewProvider{
    static var previews: some View {
        FirstTabView()
    }
}
```
ビューが生成されるとｔａｓｋはオプションナル偶然順位と一緒に始まる。この作業
は`changeTitle()と言う関数を呼び出す後非同期的に実行される時まで待ってます。

`changeTitle()`関数は新しい題目文字列を返却する前に長くかかる作業をシミュレーターするためにスレッドを５秒間にｓｌｅｅｐされます。その後この文字列はＴｅｘｔ`ビュー {`で表示されるｔｉｔｌｅ状態変数に割り当てられます。

アプリをビールドするし実行して５秒が支援される間にターフがどうやって反応するかを確認して５秒後新しい題目が一番のターフで現れるかどうかを確認してみよう。

# 要約
ＳｗｉｆｔＵＩは実行中のアプリで生命周期が変更されるイベントが発生する場合措置を取られる様に設計された修正者を提供します。`onAppear()`と`onDisappear()`修正者は使用者インタフェイス`レイアウトvhz`内で`ビュー {`が現れるとか消える時にまで作業を実行する様に使用される事ができます。反面、`onChange()`修正者は属性で割り当てられた値が変更されるたびに、ある作業を実行するので有用です。

SchenePahse環境プロパティをonChange()修正者と一緒に使うならアプリが画面状態が変更される時期を識別するができるこれはアプリがフォーグラウンドモードとバッグラウンドモードの間を移動する瞬間を知るしかならない場合に有用です。`task()`修正者を使用して`ビュー {`を作る時に非同期作業を