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が送信されてから呼ばれる感じがします。
大きいファイルであれば気持ち良い感じでプログレスバーが進みます。
しかし、小さいファイルだと一気に進んでいるように感じてしまいます・・・
まぁ小さいファイルだったら、そもそもプログレスバーなどで進捗状況を知らせる必要もないのかもしれないですが・・・
他に方法があれば是非教えていただきたいです。( ゚∀゚)
コメント