エラーの原因
このエラーは、@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をループ内で呼ぶのではなく、データをまとめて更新することで、パフォーマンスを向上 させる。


コメント