Article

Pausing and Resuming Downloads ダウンロードを一時停止および再開する

Allow the user to resume a download without starting over. ユーザにダウンロードを最初からやり直すことなく再開させます。

Overview 概要

Your app or the user may need to cancel an in-progress download and resume it later. By supporting resumable downloads, you save both the user’s time and network bandwidth. あなたのアプリまたはユーザは、処理中のダウンロードを取り消してそれを後で再開する必要があるかもしれません。再開可能なダウンロードをサポートすることによって、あなたはユーザのもつ時間とネットワークバンド幅の両方を節約します。

You can also use this technique to resume a download that fails due to a temporary loss of connectivity. あなたはまた、このテクニックを使って、接続性の一時的喪失のために失敗するダウンロードを再開します。

Store the Resume Data Object When You Cancel the Download 再開データオブジェクトをあなたがダウンロードを取り消す時に格納する

You cancel a URLSessionDownloadTask by calling cancel(byProducingResumeData:). This method takes a completion handler which is called once the cancellation is complete. The completion handler receives a resumeData parameter. If it it not nil, this is the token you use later to resume the download. Listing 1 shows how to cancel a download task and store resumeData, if it exists, in a property. あなたは、URLSessionDownloadTaskcancel(byProducingResumeData:)を呼び出すことによって取り消します。このメソッドは、ある完了ハンドラを取ります、それはひとたび取り消しが完了するすれば呼び出されます。完了ハンドラは、あるresumeDataパラメータを受け取ります。それがnilでないならば、これはあなたが後で使ってダウンロードを再開するトークンです。コード出力 1 は、どうやってダウンロードタスクを取り消して、もしそれが存在するならば、resumeDataをあるプロパティに格納するかを示します。

Listing 1 Storing the resume data when canceling a download コード出力 1 あるダウンロードを取り消す場合に再開データを格納する

downloadTask.cancel { resumeDataOrNil in
    guard let resumeData = resumeDataOrNil else { 
      // download can't be resumed; remove from UI if necessary
      return
    }
    self.resumeData = resumeData
}

Store the Resume Data Object When a Download Fails 再開データオブジェクトをあるダウンロードが失敗する時に格納する

You can also resume a download that has failed due to a temporary loss of connectivity, as when the user walks out of WiFi range. あなたはまた、接続性の一時的喪失のために失敗したダウンロードを再開できます、ユーザがWiFi範囲を出て行く時のように。

When the download fails, the session calls your urlSession(_:task:didCompleteWithError:) delegate method. If error is not nil, look in its userInfo dictionary for the key NSURLSessionDownloadTaskResumeData. If the key exists, save the value associated with it to use later when you try to resume the download. If the key does not exist, the download can’t be resumed. ダウンロードが失敗する時、そのセッションはあなたのurlSession(_:task:didCompleteWithError:)委任先メソッドを呼び出します。errornilでないならば、それのuserInfo辞書をキーNSURLSessionDownloadTaskResumeDataを求めて覗き込みます。そのキーが存在するならば、それと結びつけられた値を保存して、後々あなたがダウンロードを再開しようと試みる時に使います。キーが存在しないならば、ダウンロードは再開されることができません。

Listing 2 shows an implementation of urlSession(_:task:didCompleteWithError:) that retrieves and saves the resumeData object, if any, from the error. コード出力 2 は、urlSession(_:task:didCompleteWithError:)のある実装を示します、それはresumeDataオブジェクトを、もしあれば、エラーから回収して保存します。


func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    guard let error = error else {
        // Handle success case.
        return
    }
    let userInfo = (error as NSError).userInfo
    if let resumeData = userInfo[NSURLSessionDownloadTaskResumeData] as? Data {
        self.resumeData = resumeData
    } 
    // Perform any other error handling.
}

Use the Stored Resume Data Object to Resume Downloading 格納された再開データオブジェクトを使ってダウンロードを再開する

When it’s appropriate to resume the download, create a new URLSessionDownloadTask by using the downloadTask(withResumeData:) or downloadTask(withResumeData:completionHandler:) method of URLSession, passing in the resumeData object you stored earlier. Then call resume() on the task to resume the download. ダウンロードを再開するのに適切である場合、新しいURLSessionDownloadTaskURLSessiondownloadTask(withResumeData:)またはdownloadTask(withResumeData:completionHandler:)メソッドを、あなたが前に格納したresumeDataオブジェクトを渡して、使うことによって作成してください。それからresume()をそのタスク上で呼び出して、ダウンロードを再開してください。

Listing 3 Creating and starting a download task from resume data コード出力 3 ダウンロードタスクを再開データから作成して開始する

guard let resumeData = resumeData else {
    // inform the user the download can't be resumed
    return
}
let downloadTask = urlSession.downloadTask(withResumeData: resumeData)
downloadTask.resume()
self.downloadTask = downloadTask

If the download resumes successfully, the task calls your delegate’s urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) method. You can use the offset and byte count parameters to inform the user that the download has resumed and has preserved its earlier progress. ダウンロードがうまく再開するならば、タスクはあなたの委任先のもつurlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)メソッドを呼び出します。あなたは、オフセットおよびバイト数パラメータを使って、ユーザにダウンロードが再開されているそしてそれの前の進捗が保全されていることを告知できます。

See Also 参照

Downloading ダウンロード