エラー対応:起動時:Capture of ‘self’ with non-sendable type ‘WPPosts’ in a `@Sendable` closure

スポンサーリンク
スポンサーリンク

エラーの原因

このエラーは、@Sendable なクロージャ内で self をキャプチャしているが、self が Sendable に準拠していないために発生します。
Swift Concurrency では、並行処理(特に Task {} や async クロージャ)内で Sendable でない型を扱うと、データ競合のリスクがあるためエラーになります。

対応策

修正ポイント:

  1. self を weak self でキャプチャする(推奨)
  2. DispatchQueue.main.async を1回にまとめる
    • DispatchQueue.main.async {} をループ内で何度も呼ばず、メインスレッドで一括処理する。
  3. Task {} を使い、メインスレッドで listPosts() を呼び出せるようにする

修正のポイント

① @MainActor を WPPosts に追加

  • ObservableObject は UI の変更を行うため、@MainActor を付けることで、@Published プロパティの更新が常にメインスレッドで行われるようにする。
  • これにより DispatchQueue.main.async を明示的に使わなくてもよくなる。

② Task { [weak self] in ... } を使用

  • self を weak でキャプチャし、メモリ管理の問題を回避。

③ MainActor.run を使い、メインスレッドで一括更新

  • DispatchQueue.main.async をループ内で呼ぶのではなく、データをまとめて更新することで、パフォーマンスを向上 させる。

コメント