タスクと非同期処理の基本的な使用方法(task | sleep)

この記事は約4分で読めます。
  • iOS:15.0以上
  • XCode(当サイトの環境):15.0.1

SwiftUIでのtask修飾子は、ビューが表示されるときに非同期操作を開始するために使用されます。
taskは、ビューのライフサイクルイベントに基づいて非同期コードを実行することが出来ます。
例えば、ビューが表示された直後にデータをフェッチする場合や、何らかの非同期処理を行いたい場合に非常に便利です。

taskの基本的な使用法

以下は、task修飾子を使用して非同期処理を実行する基本的な例です。
この例では、2つのTextをそれぞれ異なるタスク内で処理して表示しています。

  • 1つ目のTextは、起動後メッセージを変化させるTask
  • 2つ目は、1秒間隔で数値をカウントしていくTask
import SwiftUI

struct TaskSmp: View {
    @State private var data: String = "Loading..."
    @State private var count: Int = 0
    @State private var flag: Bool = false

    var body: some View {
        Text(data)
            .task {
                await loadData()
            }
        Text("\(count)")
            .task {
                await countData()
            }
    }

    func loadData() async {
        do {
            // ここに非同期処理を記述
            // 例: 2秒後に表示するメッセージを切り替える
            try await Task.sleep(nanoseconds: 2 * 1_000_000_000)
            data = "Data loaded successfully!"
        } catch {
            data = "Failed to load"
        }
    }
    func countData() async {
        do {
            while(true) {
                // 例: 1秒ごとにカウントする
                try await Task.sleep(nanoseconds: 1_000_000_000)
                count += 1
            }
        } catch {
            count = 0
        }
    }
}

起動後それぞれのタスクにおいてSleepを動作させます。

1つのタスクは、Sleepにより2秒間タスクの動作を停止しており、もう1つは1秒間停止するとともにWhileで繰り返し処理を行います。

上記のコードにより、2つのテキストが非同期で変化するサンプルプログラムになっています。

注意点

  • taskブロック内でawaitを使用することで、非同期関数を呼び出すことができます。これにより、UIスレッドをブロックせずに時間のかかる処理を実行できます。
  • taskはビューが表示されるたびに実行されます。そのため、ビューが頻繁に表示される場合は、不要な非同期処理が複数回実行されることがあります。これを避けるために、状態を適切に管理するか、非同期処理の実行条件を工夫する必要があります。
  • task修飾子内で起動された非同期タスクは、ビューが画面から消えると自動的にキャンセルされます。これにより、ビューが非表示になった後も不要な処理が続行されることを防ぎます。

まとめ

task修飾子を使うことで、SwiftUIでの非同期処理の管理が簡単になり、コードの可読性と保守性が向上します。
特に、UIの初期化時にデータをロードするなど、ビューの表示に伴う非同期処理を行う場合に有効です。

タイトルとURLをコピーしました