4. ダウンロードリスト管理
SDK ストレージに登録されたコンテンツデータを状態別に照会・管理する方法を説明します。 Android とはことなり iOS SDK はローカル DB 永続化なしに SDK が管理するデータソースを取得し、アプリレイヤーで直接フィルタリングして進行中・完了・最近のダウンロード UI リストを構成します。
このドキュメントのすべてのサンプルコードは、公式サンプルアプリ kollus_player_ios をもとに作成されています。
全コンテンツリストの取得
func contents() -> [KollusContent] {
return storage.contents() as! [KollusContent]
}
storage.contents() メソッドは、SDK が管理するすべての KollusContent オブジェクト(ダウンロード進行中・完了・失敗・サンプルなど)が統合された元の配列を返します。
この元の配列を受け取り、以下の例のように用途別にフィルタリングして使用します。
ダウンロード進行中コンテンツリストの取得
全リストから、容量がまだいっぱいになっていない(progress < 1)かつタイプがダウンロード中のコンテンツのみをフィルタリングして、進行中リストを構成します。
func getDownloadList() -> [KollusContent] {
let contentsList = contents()
return contentsList.filter { content in
let progress = CGFloat(content.downloadSize) / CGFloat(content.fileSize)
return (progress < 1 && content.contentType == .downloading)
|| (progress < 1 && content.contentType == .adaptiveDownload)
}
}
ダウンロード完了コンテンツリストの取得
全リストから、通常ダウンロードが完了しているか、Adaptive ダウンロードの進行率が 100%のコンテンツのみをフィルタリングして、完了リストを構成します。
func getCompletedList() -> [KollusContent] {
return contents().filter { c in
(c.contentType == .downloading && c.downloaded)
|| (c.contentType == .adaptiveDownload && c.downloadProgress == 100)
}
}
最近のダウンロードリストの取得(7 日以内)
ダウンロードが最終完了したコンテンツのうち、完了日時が現在時刻を基準に 7 日以内のコンテンツのみを抽出します。
func getRecentlyAddedFileList() -> [KollusContent] {
let now = Date().toLocalTime()
return contents().filter { c in
guard (c.contentType == .downloading && c.downloaded)
|| (c.contentType == .adaptiveDownload && c.downloadProgress == 100)
else { return false }
let downloadedDate = KollusUtil.integerToDate(int: c.downloadedTime)
return downloadedDate.daysBetween(date: now) <= 7
}
}
downloadedTime プロパティは、ダウンロード完了時点の整数型タイムスタンプ(epoch seconds)を返します。
公式サンプルアプリに含まれている KollusUtil.integerToDate(int:) メソッドを使用して簡単に変換できます。
ダウンロード状態フラグの定義
コンテンツオブジェクトの分類および状態を判断する際に参照する KollusContentType の仕様です。
| 区分 | 説明 |
|---|---|
.downloading | 通常ダウンロードコンテンツ(進行中・完了状態のオブジェクトを両方含む。downloaded プロパティで分岐) |
.adaptiveDownload | Adaptive HLS ダウンロードコンテンツ(downloadProgress プロパティで分岐) |
.sample | サンプルコンテンツ(全削除時に保持を推奨) |
ダウンロード完了の判定基準
ダウンロード方式によって完了状態を判断する基準が異なります。以下のルールを参照して進行中・完了状態を分岐してください。
- 通常ダウンロード (
.downloading):downloaded == trueであれば完了 - Adaptive HLS ダウンロード (
.adaptiveDownload):downloadProgress == 100であれば完了
リスト表示とカスタムソート
公式サンプルアプリは、ユーザーの設定に応じてコンテンツタイトル・ダウンロード完了日時・ファイルサイズの順にリストを並び替えるガイドモデルを提供します。
list.sort {
if $0.fileType != $1.fileType {
return $0.fileType > $1.fileType // Sort so that folders always appear above regular files
}
switch PreferenceManager.sortOrder { // Branch based on user-configured sort order
case Sort.name.rawValue:
return $0.title < $1.title
case Sort.downloadedTime.rawValue:
return $0.downloadedTime > $1.downloadedTime
default:
return $0.fileSize > $1.fileSize
}
}