1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIAdvent Calendar 2023

Day 7

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

Last updated at Posted at 2023-12-07

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

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

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

壱 LifecycleDemoプロジェクト生成する

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

壱・一 onAppearおよびonDisappear修正者

一番基本的でしばしば使用される.修正者onAppear()onDisappear()ビュー {でその様な修正者を適応すればビュー {が現れたり消えたりする視点で作業を実行することができます。
FirstTabView.swiftファイルで次の様に二つの修正者をtextビュー{で追加しましょう

struct FirstTabView: View {
    var body: some View {
        Text("View One")
+            .onAppear(perform: {
+                print("onAppear triggered")
+            })
+            .onDisappear(perform: {
+                print("onDisappeard triggered")
+            })
    }
}

壱・二 onChange修正者

基本的に.onChange()はアプリ内で状態が変更される時たびに作業を遂行しなければならない時に使われるべきだ。これを作動することを見るとSecondTabView.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修正者

ScenePhaseは現在の画面の状態を保存するためSwiftUIで使用する@Environment属性ですScenePhaseに対する変更事項がonChange().修正者によってモニタリングされる場合には、例えば画面がフォーグラウンドからバッグラウンド転換されるとか活性化、または非活性化される時にアプリは作業を実行します。この技術はすべてのビュー {または画面で使われることがありますが、アプリの宣言ぶで適用する時も有用です。

@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")
+      }
        })
    }
}

その様な方法でウィンドウグループで適応すれば、画面の段階はアプリ内の全画面の状態を基でします。言い直して現在活性化された画面があれば、段階が活性で設定されることですべての場面が非活性化された場合に限って非活性化で設定されるだろう。

反面、個別ビュー {で適用されば段階状態はビュー {が位置された画面の状態だけを反映する。例えば.修正者が次の様にウィンドウグループ代わりにコンテントビュー {で適用されることができます。

var body: some Scene {
        WindowGroup {
            ContentView()
+                .onChange(of: ScenePhase, perform: { phase in
                    
+                })
        }

デバイスまたはシミュレーターであぷりを実行してアプリをバッグラウンドで送る。そしたらコンソールで非活性状態で変更されるあと背景段階で変更されたと表示されるだろう。アプリをもう一度ぷぐらんどで戻したら活性段階で入るだろう。三つの画面段階は次の様に予約できます。

  • Active -画面がプグランドであるし、使用者で表示されるし、使用者インタラックションに反応する。
  • inactive - 画面がプグランドであるし、使用者で表示されるだけど使用者インタラックションに反応しない。
  • background - 使用者に画面が現れない

参 同時作業始める

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

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()
    }
}

ビューが生成されるとtaskはオプションナル偶然順位と一緒に始まる。この作業
は`changeTitle()と言う関数を呼び出す後非同期的に実行される時まで待ってます。

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

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

要約

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?