この記事は千 Advent Calendar 2018の17日目の記事です。
弊社では開発しているiOSアプリではバッググラウンドでファイルのアップロード処理を行う機能があります。
本記事ではその実装で得られた開発Tipsを2つ紹介します。
環境
- Xcode10.1
- iOS12.1
重複実行の制御
弊社のアプリでは重複してアップロードを行うと期待した動作にならないため、次の制御を行っています。
-
URLSessionConfiguration
にアップロード処理毎にidを設定 - アップロード処理の実行前に
URLSession
の tasks を確認し、存在した場合は新たにアップロード処理を実行しない
コードは以下になります。
// URLSessionConfigurationでidを設定
let id = generate()
let config = URLSessionConfiguration.background(withIdentifier: id)
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
session.getAllTasks { [weak self] tasks in
guard let self = self else { return }
// 重複実行を避けるためにtasksに存在ないことを確認してから新しいtaskを実行します。
guard tasks.isEmpty else { return }
// taskの実行処理をここで実装。
}
並行処理数の制御
弊社のアプリでは一度に数百枚から数千枚のファイルのアップロードを行うため、並行処理数の制御を行う必要がありますが、検証したところ URLSession
は自動で並行処理数の制御を行ってくれていました。
また、私が検証した環境では、ネットワーク環境によって並行処理数が変わっていたため、自前で制御するよりも効率的に実行されていると思います。
検証には URLSessionTaskDelegate
を実装し、進捗を見て行いました。
コードは以下になります。
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
guard let id = session.configuration.identifier else {
return
}
print(id)
print(totalBytesSent)
print(totalBytesExpectedToSend)
}