LoginSignup
1
4

More than 5 years have passed since last update.

iOSのバッググラウンドアップロード処理の重複制御と並行処理制御

Posted at

この記事は千 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)
    }
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4