作業日報
やったこと
- コンテンツ取得用不定期型バックグラウンドタスクの実装
わかったこと
- v13から導入されているBackground Task Refresh/processingが導入されている。(Background fetchは非推奨)
- 注意点
- 実機しか動かない。
- デバック方法がめんどい。※参照
- 不定期で実行される。
- BGAppRefreshTaskRequestのearliestBeginDateは実行しない間の時間を示す。したがって、タスクをいつ実行するかはシステムが決める。
- バッテリーなどシステムの状態で更新頻度に影響が出る!?。
- 感想
- 基本的にドキュメントとサンプルに従えば、実装は用意。
- 問題はバックグランドタスク内での非同期処理である。WebAPI呼び出しやDB操作などは、処理と処理の結果は分離している事が多いので、Operationは処理の結果を待つ前に消滅する。そのため、結果が反映がされない。結論から言えば、その対応の答えは上のサンプルの中にある。先ず、必要なのはOperationを非同期型に対応することである。このタスクが完了するまで、待たせるように実装する必要がある。Operationのいつくかのプロパティ、メソッド(isAsynchronous、isExecuting、isFinishedなど)をオーバライドするだけで、非同期処理に対応することができる。非同期処理自体はオーバライドしたstartメソッドの中で呼び出せば良い。また、バックグランドタスクでは、複数のタスク依存関係を定義することで、(一部)直列的にチェインすることができる。なお、今回の実装はswiftuiのlifecyleを利用しているので、Appのinitの中でタスクを登録し、バックグランド移行のイベント(.onChangeのnewScenePhase==.background)の中でスケジューリングを開始している。
- 注意点
つぎすること
- to be continue