Должен ли я выбрать URLSessionDataTask или URLSessionDownloadTask для получения изображения - PullRequest
0 голосов
/ 15 апреля 2020

Я использую URLSession и URLSessionDataTask, чтобы получить изображение с сервера и отобразить его в приложении. Я посмотрел здесь . Похоже, URLSessionDownloadTask имеет больше возможностей.

В настоящее время я использую следующий код для получения изображения:

let task = URLSession.shared.dataTask(with: url) {(data, response, error) in

    guard error == nil else {
        completion(error, nil)
        return
    }

    completion(nil, data)            
}        
task.resume()

Я хотел бы иметь возможность приостановить, отменить и возобновить процесс получения изображения с сервера. Я вижу в документации, что URLSessionDataTask также имеет эти опции. Но для метода приостановки URLSessionTask также написано, что:

Задача загрузки может продолжить передачу данных позднее. Все остальные задачи должны начаться заново при возобновлении.

Поэтому мой вопрос таков: должен ли я изменить реализацию, чтобы использовать URLSessionDownloadTask для получения изображений, если мне нужно будет прекратить получать изображение в какой-то момент? указать и возобновить позже, не теряя текущий прогресс? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Да, если вы хотите возобновить приостановленную задачу, задача загрузки позволяет возобновить ее с того места, на котором она остановилась.

Другие причины, по которым вы можете захотеть использовать задачи загрузки, включают:

  • пиковое использование памяти меньше, поскольку задачи загрузки записывают данные во временный файл по мере его продвижения, тогда как задачи с данными удерживают весь ресурс в памяти; и

  • с задачами загрузки, вы можете использовать URLSessionConfiguration.background, чтобы загрузка продолжалась даже после того, как пользователь покинул ваше приложение.

1 голос
/ 15 апреля 2020

NSURLSessionDataTask : задачи данных обмениваются данными с использованием NSData. NSURLSessionDataTask не поддерживается в фоновых сессиях, потому что он не записывает содержимое в виде локального файла (хранящегося в памяти). Поэтому его нельзя возобновить позже.

NSURLSessionDownloadTask : NSURLSessionDownloadTask напрямую записывает данные ответа во временный файл. Он поддерживает фоновые загрузки, когда приложение не запущено, и в вашем случае разрешает возобновление загрузок.

Вопрос в том, почему вы хотите возобновить загрузку «изображения», которое вы пытаетесь отобразить в приложении. , Это когда-нибудь изменится? или оно всегда будет одинаковым в приложении. Если у него есть шанс измениться в будущем, я думаю, что вы должны придерживаться URLSessionDataTask, потому что, по его мнению, он будет поглощать локальное хранилище для загрузки и записи изображений снова и снова.

Риск использования NSURLSessionDownloadTask заключается в том, что перед загрузкой вам нужно будет проверить, достаточно ли места для загрузки на устройстве впереди go, иными словами, это необходимо для обработки ошибок fileSize, так как Apple считает, что это зависит от разработчика. соответствовать этим требованиям

...