[swift] Swift로 파일 다운로드 진행상황 보기

개요

파일 다운로드 과정에서 진행 상황을 사용자에게 보여주는 것은 중요합니다. Swift 언어를 사용하여 파일 다운로드 진행 상황을 표시하는 방법에 대해 알아보겠습니다.

URLSession을 이용한 파일 다운로드

파일을 다운로드하기 위해서는 URLSession을 사용해야 합니다. URLSession의 delegate를 사용하여 다운로드 과정에 따른 이벤트를 받을 수 있습니다.

import Foundation

class DownloadManager: NSObject, URLSessionDownloadDelegate {
    var downloadProgress: Float = 0
    
    func downloadFile(from url: URL, completionHandler: @escaping (URL?, Error?) -> Void) {
        let session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue())
        let downloadTask = session.downloadTask(with: url) { (url, response, error) in
            // 파일 다운로드 완료
            completionHandler(url, error)
        }
        downloadTask.resume()
    }
    
    // 파일 다운로드 진행 상황 업데이트
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        downloadProgress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
        
        // 다운로드 진행 상황을 사용자에게 표시
        print("다운로드 진행 상황: \(downloadProgress)")
    }
    
    // 파일 다운로드 완료 시 호출되는 메서드
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        // 다운로드된 파일의 위치
        let destinationURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent(location.lastPathComponent)
        
        do {
            try FileManager.default.moveItem(at: location, to: destinationURL!)
        } catch {
            print("파일 이동 에러: \(error)")
        }
    }
}

위의 코드는 URLSession의 delegate 메서드를 구현하여 파일 다운로드 진행 상황을 표시하는 DownloadManager 클래스 예시입니다. downloadProgress 변수를 사용하여 다운로드 상황을 업데이트하고, 임의로 print문을 사용하여 다운로드 상황을 콘솔에 출력하였습니다.

사용 예시

다음은 위에서 작성한 DownloadManager 클래스를 사용하는 예시입니다.

let downloadManager = DownloadManager()
let fileURL = URL(string: "https://example.com/file.jpg")

downloadManager.downloadFile(from: fileURL) { (url, error) in
    if let error = error {
        print("파일 다운로드 실패: \(error)")
    } else {
        print("다운로드 완료")
    }
}

위의 예시는 fileURL에서 파일을 다운로드하고, 다운로드가 완료되면 다음 동작을 수행하는 간단한 코드입니다. 파일 다운로드 완료 시 “다운로드 완료”를 출력하며, 실패 시에는 실패 이유를 출력합니다.

결론

Swift를 사용하여 파일 다운로드 진행 상황을 보는 방법에 대해 알아보았습니다. URLSession의 delegate 메서드를 활용하여 파일의 다운로드 진행 상황을 업데이트하고 사용자에게 표시할 수 있습니다. 위의 예시를 참고하여 파일 다운로드 기능을 구현해 보시기 바랍니다.

참고 자료