中断/再開可能な転送
中断/再開可能な転送では、転送途中での中断と再開を行うことができます。通信品質がよくない環境で大きなファイルをアップロードまたはダウンロードするような場合、特にこの機能の利用が適しています。
アップロード完了と同時に、Object に紐付く Object Body がアップロードしたデータに入れ替わります。このとき、既存の Object Body がある場合は、自動的に削除されます。また、同時更新となった場合は、後からアップロードが完了したデータになります(Object Body には楽観的ロックの仕組みはありません)。
中断/再開可能なアップロードでは、各 Object Body にサイズの上限はなく、合計サイズが料金プランのストレージ上限に達するまで格納できます。
クラス構成
以下にクライアント SDK で Object Body の転送を行うためのクラス構成を示します。なお、iOS では <<interface>>
を <<protocol>>
に読み替えてください。
KiiObjcet に転送対象のファイルを指定すると、KiiUploader または KiiDownloader を作成できます。これらのオブジェクトにより、アップロード処理とダウンロード処理をコントロールできます。また、転送開始時に、コールバックを指定することで、何バイト中の何バイトまでの転送が完了したかという進捗状況を取得できます。
転送中の KiiUploader と KiiDownloader は、KiiBucket 配下にある KiiRTransferManager で管理されます。ここでは、転送中のファイル一覧が保持されており、転送が完了すると一覧から消去されます。
KiiUploader と KiiDownloader は、それぞれ内部に KiiRTransferInfo を持っており、転送中のバイト数などの状況を取得できます。
転送の状態
転送を開始した KiiUploader や KiiDownloader は、インスタンス内に状態を持ちます。状態は KiiRTransferStatus で定義された以下 3 通りの値を持ち、状態遷移図のように遷移します。
シンボル | 説明 |
---|---|
NOENTRY | 転送がない状態です。 |
ONGOING | 転送が実行中の状態です。 |
SUSPENDED | 転送は中断され、再開できる状態です。 |
NOENTRY 状態に遷移すると、KiiUploader または KiiDownloader インスタンスは KiiRTransferManager の管理下から消えて、ライフサイクルを終えます。
Android では、ONGOING 状態で回復可能なエラーが発生した場合の動きに注意が必要です(iOS にこの動きは該当しません)。たとえば、転送開始時にファイルがなかった場合などは後から回復できるため、KiiUploader または KiiDownloader は SUSPENDED 状態になって残ります。エラーが発生したとき、タスクを取り消したい場合はユーザープログラムで terminate() を実行する必要があります。この処理を忘れると、エラーが発生した KiiUploader や KiiDownloader が KiiRTransferManager の配下に増え続けます。
実装時の注意点
Object Body の取り扱いについては以下の注意点があります。
Android では、実行中にプロセスが終了した場合でも転送状況は保持されます。
- このデータはクライアント SDK 内部でストレージに保存されるため、KiiRTransferManager 配下から削除する実装を行うか、ユーザーが OS の設定画面からモバイルアプリの「データを消去」を実行するまで残ります。
- 転送中にモバイルアプリのプロセスが終了し、次回にプロセスが起動した場合は SUSPENDED 状態で残っています。
- 転送中にモバイルアプリが切り替わっても、クライアント SDK を使ったプロセスがメモリ上にある場合はそのまま動作を継続します。
iOS では、ホームボタンやロックボタンが押されてプロセスが切り替わったとき、クライアント SDK によって自動で転送が中断状態となります。
転送中は対象のファイルに直接アクセスします。SUSPENDED 中にローカルのファイル本体が変更された場合などはエラーとなります。
プラットフォームによっては複数の転送を同時に実行できるものがあるため、転送結果に矛盾が生じないよう、モバイルアプリ側で管理する必要があります。たとえば、同時に複数のアップロードを行うと、完了した順番によっては意図しない結果になることがあります(ただし、ファイルの内容が混ざったような結果にはなりません)。
アップロードが完全に終わるまでは、ダウンロードできるのはそれまでクラウドに登録されていた Object Body の内容です。アップロードが完了すると、新しい Object Body に切り替わります。アップロード完了時にダウンロード中のものがあった場合、そのダウンロードはエラーとなります。