Ответ 1
Официальный ответ cnoon (член Alamofire):
Привет @Tulleb,
Извиняюсь за то, что вы не вернетесь к вам раньше. Пример @katopz не тот же тип запроса. Этот пример демонстрирует, как использовать задача данных, а не задача загрузки. Если вы не хотите загружать файл, вы можете сделать следующее:
Alamofire.request(url).responseData { response in guard let data = response.result.value else { return } let image = UIImage(data: data) print(image) }
Однако, чтобы ответить на ваш вопрос, вы сталкиваетесь с проблемой разрешений для песочницы. Мы разрешаем вам использовать загружать API без указания закрытия адресата для работы такие системы, как macOS, где вы можете обращаться к файлам за пределами ваших собственных песочница. Однако на iOS вы не можете напрямую обращаться к данным который находится вне вашей песочницы. Вот почему вы видите .inputFileReadFailed ошибка.
Есть несколько способов решить эту проблему.
Вариант 1
Вы можете загрузить данные с помощью API запросов, как показано выше, загружает данные изображения в память, а не на диск.
Вариант 2
Вы можете переместить файл в свою изолированную область, прежде чем обращаться к данным используя закрытие адресата. Вот пример того, как это сделать:
let destination: DownloadRequest.DownloadFileDestination = { _, _ in let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] let documentsURL = URL(fileURLWithPath: documentsPath, isDirectory: true) let fileURL = documentsURL.appendingPathComponent("image.png") return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) } Alamofire.download("https://httpbin.org/image/png", to: destination).responseData { response in debugPrint(response) if let data = response.result.value { let image = UIImage(data: data) print(image) } else { print("Data was invalid") } }
//Выходы:
//[Запрос]: https://httpbin.org/image/png//[Ответ]: {URL: https://httpbin.org/image/png} {код состояния: 200, заголовки {// "Access-Control-Allow-Origin" = "*"; // "Content-Length" = 8090;// "Content-Type" = "Изображение/PNG";//Дата = "Сб, 24 сен 2016 21:34:25 GMT"; //
Server = nginx;// "access-control-allow-credentials" = true;//} }//[TemporaryURL]: /private/var/mobile/Containers/Data/Application/ 25612024-9A05-4ED5-AF3B-A98E22DEAD7A/tmp/CFNetworkDownload_fD9sXf.tmp // [DestinationURL]: /var/mobile/Containers/Data/Application/ 25612024-9A05-4ED5-AF3B-A98E22DEAD7A/Documents/image.png // [ResumeData]: 0 байт//[Результат]: УСПЕХ: 8090 байт // [Сроки]: Временная шкала: { "Время начала запроса": 496445664.792, "Начальная Время отклика": 496445665.651, "Запрошенное время выполнения": 496445665.655, "Время завершения сериализации": 496445665.655, "Задержка": 0,860 с, "Длительность запроса": 0,863 с, "Сериализация Продолжительность": 0,000 с, "Общая продолжительность": 0,864 сек}// Необязательно (, {100, 100}). Вы ДОЛЖНЫ использовать если вам нужно загрузить файл на диск. временный файл может быть доступен только внутри обратного вызова делегата, который обрабатывается внутри Alamofire. Если вы не указали закрытие пункта назначения в iOS, временныйURL всегда укажет на где временный файл ранее был сохранен, но был очищен.Резюме
Итак, если вам не нужно загружать данные на диск, то вам нужен вариант 1. Если вы хотите сохранить файл на диске, то вы выберите вариант 2.
Приветствия. 🍻