ネットワークを用いたサーバサイドとのやりとりをする必要のあるアプリケーションでは特に、まとまったリクエストをバックグラウンドで捌き続けてくれる、JobQueue の仕組みが欲しくなることが有ります。
ネットワーク I/O を伴わなくても、様々な処理のまとまり(ジョブ)を非同期に逐次実行したり、電源が切れても、再起動した時にジョブの続きを勝手に処理してくれたりするような、永続化の仕組みと組み合わせられた JobQueue はとても便利です。
これによって、長時間かけて実行される非同期処理が簡単に取り扱えるようになります。
Android、iOS ともに、バックグラウンドで逐次実行する簡易な仕組みは標準フレームワークでも用意されています(IntentService
とかNSOperation
とNSOperationQueue
とか)が、オンメモリで管理されるので、電源が切れたりすると無かったことに…
このため、電源を切ってもキューに積んだジョブが保持されるようにするためには、何らかの永続化の仕組みを用いて管理する必要があります。
Android、iOS ともに、これらを実現するライブラリがいくつか有ります。
Android
Android Priority JobQueue
Path が出しているオープンソースのライブラリです。MIT ライセンスで配布されています。
優先順位付けのあるキューを用いて、優先順位の高いものからジョブをさばいてくれます。
ネットワークにアクセスする必要のあるジョブがキューに積まれている場合、コネクションが無い時は優先順位にかかわらず他のネットワークを必要としないジョブが優先して実行されます。
また、ジョブのグループ化を行って、並列実行されては困るジョブのリストを逐次実行するようにしてくれたり、ジョブの実行を遅延したり、リトライの判断を自分で拡張できたりします。
nirai
Android Advent Calendar 2013 で公開されたライブラリです。Apache ライセンスで配布されています。
シンプルな API で、キューに積まれたジョブを逐次実行してくれます。
ネットワーク I/O の実行を前提として作られており、ジョブの実行中に I/O の例外が発生した場合にNetworkOfflineException
をスローすることで、一定の時間を経過した後自動でジョブをリトライしてくれます。
iOS
queue
GCD と SQLite3 によるジョブキューの実装です。用意されたデリゲートメソッドにしたがって実装することで、あとの面倒はこのライブラリが見てくれます。
iOS5 以上をサポートしています。
ジョブの結果はデリゲートメソッドの返り値として表現しますが、EDQueueResult
によって表される状態に応じて、ジョブが終わった時の振る舞いが変わります。
特に、失敗時にリトライをするかどうかが変わるところが注意を必要とします。