エラーの原因
このエラーは、@Sendable
なクロージャ内で self
をキャプチャしているが、self
が Sendable
に準拠していないために発生します。
Swift Concurrency では、並行処理(特に Task {}
や async
クロージャ)内で Sendable
でない型を扱うと、データ競合のリスクがあるためエラーになります。
対応策
修正ポイント:
self
をweak self
でキャプチャする(推奨)DispatchQueue.main.async
を1回にまとめるDispatchQueue.main.async {}
をループ内で何度も呼ばず、メインスレッドで一括処理する。
Task {}
を使い、メインスレッドでlistPosts()
を呼び出せるようにする
修正のポイント
① @MainActor を WPPosts に追加
ObservableObject
は UI の変更を行うため、@MainActor
を付けることで、@Published
プロパティの更新が常にメインスレッドで行われるようにする。- これにより
DispatchQueue.main.async
を明示的に使わなくてもよくなる。
② Task { [weak self] in ... } を使用
self
をweak
でキャプチャし、メモリ管理の問題を回避。
③ MainActor.run を使い、メインスレッドで一括更新
DispatchQueue.main.async
をループ内で呼ぶのではなく、データをまとめて更新することで、パフォーマンスを向上 させる。
コメント