【Swift / iOSアプリ開発】メインスレッド?バックエンド?DispatchQueue / Task / 非同期?同期

iOS

Dispatch / DispatchQueue

Dispatchとは?急送、送り出す、派遣する、だそうです。なるほど処理させるという感じですね

Dispatch | Apple Developer Documentation
Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

@Published変数はバックグラウンドスレッズで更新できません!
publish valuesは必須。と

つまりはメインスレッドでということでした。

DispatchQueue.global().async {
    // 重い処理をバックグラウンドスレッドで実行
    let result = performHeavyTask()
    
    // メインスレッドで値を更新
    DispatchQueue.main.async {
        self.somePublishedProperty = result
    }
}

DispatchQueue.global() バックグラウンド

DispatchQueue.main メインスレッド

ということですね

yourPublisher
    .receive(on: DispatchQueue.main) // メインスレッドで値を受け取る
    .sink { value in
        self.somePublishedProperty = value
    }
    .store(in: &cancellables)

yourPublisher は @Publishedを内包するインスタンスや
combineフレームワークで作成したパブリッシャーもあると

Swift Concurrency

Task {
    let result = await performHeavyTask()
    
    await MainActor.run {
        self.somePublishedProperty = result
    }
}

Task内では await MainActor.runとメインスレッドで実行するそう

Task iOS13..0以降

Task | Apple Developer Documentation
A unit of asynchronous work.

Task: 非同期処理を簡単に記述できる仕組み。
キャンセル対応: 必要に応じてTask.checkCancellation()を活用。
Task actor: 共有状態の安全な管理。
TaskGroup: 複数タスクを効率的に処理。
@MainActor: UI関連のコードを安全にメインスレッドで実行。

目新しいワードが続々と出てきて^^;

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

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