Swift URLsessionでプログレスバー・進捗状況を表すためのやり方

Swift Swift
Swift

Swiftでファイルをアップロードするときなど、URLSessionを使用しますが、重いファイルなどをアップロードする際に、進捗状況を表したい時があります。

その時に、delegateを使うことで進捗状況を表すことができます。
最低限必要となるのが下記の記述

コード

extension ClassName: URLSessionTaskDelegate {
    
    // ここで進捗状況の更新を行う
    func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
        
        // プログレスバーなどの値に↓
        let progressValue: Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)

    }
    
    // エラーの時に呼ばれる
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        
        // ここでエラー処理
    }
}

作成したクラス「ClassName」にURLSessionTaskDelegateを継承することで、urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)の部分が呼ばれるようになります。

このようにDelegateを実装したクラスをURLsessionを作成するときに指定します。

func hoge(){
    
    // configを設定
    let config = URLSessionConfiguration.background(withIdentifier: sessionIdentifier)
    // URLsessionを作成する時にconfigとdelegateを指定する
    let urlSession = URLSession(configuration: config, delegate: delegate, delegateQueue: .main)
        
}

URLsessionをインスタンス化する際に、先程作成したクラスをdelegateに指定します。

これだけで、プログレスバーに使うための進捗状況の値を得ることができます。

個人的には、urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)が呼ばれるタイミングがもう少し細かい方がありがたいんですが、これは指定できたりしないですかね・・・(´・ω・`)

urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)が呼ばれる時には、まぁまぁな量のByteが送信されてから呼ばれる感じがします。

大きいファイルであれば気持ち良い感じでプログレスバーが進みます。
しかし、小さいファイルだと一気に進んでいるように感じてしまいます・・・
まぁ小さいファイルだったら、そもそもプログレスバーなどで進捗状況を知らせる必要もないのかもしれないですが・・・

他に方法があれば是非教えていただきたいです。( ゚∀゚)

コメント

タイトルとURLをコピーしました