Как передать свойства swift 3 urlsession didFinishDownloading делегировать после фоновой загрузки?
Я могу успешно загрузить zip-файл в фоновом режиме с помощью кода своего приложения с ios 10 и swift 3.
Я использую задачу данных backgroundsession:
let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix))
let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)
var request = URLRequest(url: dlUrl )
request.httpMethod = "GET"
request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData
let task = backgroundSession.downloadTask(with: request)
task.resume()
Но мне интересно, как лучше передать определенные метаданные методу делегата после завершения загрузки:
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL){
Мне нужен внутри этого делегата некоторая информация об этой загрузке, которая зависит, например, от выбора, сделанного ранее пользователем. Я не могу получить эти данные с сервера или URL-адреса.
Поэтому я хотел бы иметь переменную или словарь downloadType, говорящий мне, что делать с завершенной загрузкой, чтобы иметь что-то подобное в делегате
if downloadType == "normal" ... do this
else ... do that
Я не уверен, смогу ли я безопасно использовать свойства класса, реализующего протокол URLSessionDownloadDelegate, пока приложение было приостановлено? Будет ли восстановлен сам экземпляр класса, когда загрузка завершится, пока приложение приостановлено, или ios создаст новый экземпляр класса?
Так будет ли это всегда работать:
class ServerCom: NSObject, URLSessionDownloadDelegate {
var updateTypeStr = ""
[...]
func somePublic(setUpdateType: String) {
self.updateTypeStr = setUpdateType
[...]
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL){
[...]
if( self.updateTypeStr == "normal" ) { // do this
else { // do that
Есть ли лучшие способы для этого варианта использования?
заранее спасибо!
1 ответ
Будет ли восстановлен сам экземпляр класса, когда загрузка завершится, пока приложение приостановлено, или ios создаст новый экземпляр класса?
Вы несете ответственность за сохранение и восстановление этого самостоятельно.
Ваше приложение может быть полностью закрыто (например, если оно было приостановлено, оно может быть отброшено из-за нехватки памяти) за прошедший период, пока демон выполняет ваш фоновый запрос, поэтому вы должны иметь возможность сохранить любую соответствующую информацию в постоянном хранилище и возможность загрузить это из хранилища при перезапуске приложения.
При тестировании приложений с фоновыми сессиями, мне полезно иметь код, который вызывает exit(0)
прекратить приложение. Вы никогда не делаете этого в производственном приложении, но это полезно при тестировании способности вашего приложения воссоздавать необходимые объекты, когда приложение перезапускается, когда заканчивается фоновый запрос. Ключевым моментом является то, что не следует пытаться использовать "двойное нажатие кнопки" Домой "и проведите пальцем вверх", чтобы убить приложение при выполнении этого тестирования, потому что это, по замыслу, также отменяет фоновые запросы. Вы хотите протестировать сценарий, в котором ваше приложение было прервано в течение обычного жизненного цикла приложения и перезапущено сетевым демоном после выполнения фонового запроса.