Я разрабатываю сетевой уровень в своем приложении Swift для iOS 17 и более поздних версий, и мне нужен надежный механизм для отмены определенных сетевых запросов, особенно загрузки отдельных файлов. Я рассматриваю два основных подхода: URLSession.data(for:) с async/await и URLSession.dataTaskPublisher с объединением.
Задача:
Мое приложение позволяет пользователям загружать несколько файлов в виде вложений. Мне нужна возможность отменить загрузку определенного файла, не затрагивая другие текущие загрузки.
Конкретный сценарий:
Представьте себе представление, в котором пользователь может прикрепить к сообщению несколько файлов. Если пользователь решает удалить одно из вложений во время загрузки, мне нужно отменить только задачу загрузки этого файла, не прерывая остальные.
Подход 1 : async/await с URLSession.data(for:)
Этот метод выглядит чище и современнее. Однако он не предоставляет базовый URLSessionDataTask напрямую. Из-за этого неясно, как идентифицировать и отменить конкретную задачу загрузки, особенно когда может выполняться несколько загрузок.
Подход 2: объединить с URLSession.dataTaskPublisher< /p>
Этот подход предоставляет экземпляры AnyCancellable, предлагающие способ управления запросами и их отмены. Недостатком является дополнительная сложность хранения и связывания этих AnyCancellables с уникальными идентификаторами (например, URL-адресами или UUID) для обеспечения целенаправленной отмены.
Подробнее здесь: https://stackoverflow.com/questions/793 ... tataskpubl