Pausing and Resuming Downloads

Panther·2021년 8월 16일
0

https://developer.apple.com/documentation/foundation/url_loading_system/pausing_and_resuming_downloads

"Allow the user to resume a download without starting over."

사용자가 다시 시작하지 않고도 다운로드를 재개할 수 있도록 합니다.

Overview

앱 혹은 사용자는 다운로드 중인 것을 취소할 필요가 있을 수 있으며 이후에 재개할 수도 있습니다. 재가할 수 있는 다운로드를 지원함으로써 사용자의 시간 및 네트워크 대역폭을 절약할 수 있습니다.

일시적인 연결 손실 때문에 실패한 다운로드를 재개하기 위해서 이 테크닉을 사용할 수도 있습니다.

Store the Resume Data Object When You Cancel the Download

cancel(byProducingResumeData:)를 호출해서 URLSessionDownloadTask를 취소할 수 있습니다. 이 메소드는 취소가 완료될 때 한 번 호출되는 컴플리션 핸들러를 받습니다. 컴플리션 핸들러는 resumeData 파라미터를 받습니다. nil이 아니면 다운로드를 이후에 재개하기 위해 사용하는 토큰입니다. Listing 1은 다운로드 작업을 취소하는 방법 및 resumeData가 있는 경우 이를 속성에 저장하는 방법을 보여줍니다.

Listing 1 Storing the resume data when canceling a download

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

Important
모든 다운로드가 재개될 수 있지는 않습니다. 다운로드가 재개될 수 있기에 충족되어야 하는 조건의 리스트를 보려면 cancel(byProducingResumeData:)에 있는 설명을 보시기 바랍니다. 또한, 백그라운드 설정을 사용하는 다운로드는 자동으로 재개를 처리하며, 그렇기 때문에 직접 재개하는 것은 백그라운드 다운로드가 아닌 경우에만 필요합니다.

Store the Resume Data Object When a Download Fails

사용자가 와이파이 범위를 빠져나갈 때처럼 일시적인 연결 손실 때문에 실패했던 다운로드를 재개할 수도 있습니다.

다운로드가 실패하면 세션은 urlSession(_:task:didCompleteWithError:) 딜리게이트 메소드를 호출합니다. 에러가 nil이면 userInfo 딕셔너리에서 키 NSURLSessionDownloadTaskResumeData를 찾습니다. 키가 존재하면 다운로드 재개를 시도할 때, 나중에 사용하기 위해 관련 값을 저장합니다. 키가 존재하지 않으면 다운로드는 재개될 수 없습니다.

Listing 2는 resumeData 객체가 있는 경우 에러로부터 이를 가져오고 저장하기 위한 urlSession(_:task:didCompleteWithError:)의 구현을 보여주고 있습니다.

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

다운로드 재개가 적합한 경우 URLSessiondownloadTask(withResumeData:), downloadTask(withResumeData:completionHandler:) 메소드를 사용해서 새로운 URLSessionDownloadTask를 생성해야 합니다. 이전에 저장했던 resumeData 객체를 전달하면서 생성합니다. 다음으로 다운로드 재개를 위해 작업에 resume()을 호출합니다.

Listing 3 Creating and starting a download task from resume data

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

다운로드 재개가 성공적이면 작업은 딜리게이트의 urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) 메소드를 호출합니다. 다운로드가 재개되었고 이전 진행사항이 보존되었다는 것을 사용자에게 알리기 위해 오프셋과 바이트 카운트 파라미터를 사용할 수 있습니다.

See Also


Downloading

Downloading Files from Websites

파일시스템에 파일을 직접 다운로드합니다.

https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_from_websites
https://velog.io/@panther222128/Downloading-Files-from-Websites

Downloading Files in the Background

앱이 비활성화 상태인 동안 파일을 다운로드하는 작업을 생성합니다.

https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_in_the_background
https://velog.io/@panther222128/Downloading-Files-in-the-Background


0개의 댓글