Apple has great API for this purpose: URLSessionUploadTask. Almost at the very top, Apple says: Unlike data tasks, you can use upload tasks to upload content in the background. This is not by accident. File uploads are the least-loved feature of any app as no one wants to wait nor look at progress bars. Thus the proper way to do this is to encapsulate upload functionality into a module which is somewhat independent from the rest of the app and maintain an ability to be informed how far along ...