Я хотел бы загрузить изображение из URL в моем приложении, поэтому я сначала попытался с Objective-C, и это работало, однако, с Swift, у меня ошибка компиляции:
'imageWithData' недоступен: используйте конструкцию объекта 'UIImage (data :)'
Моя функция:
@IBOutlet var imageView : UIImageView
override func viewDidLoad() {
super.viewDidLoad()
var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png")
var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)
imageView.image = UIImage.imageWithData(data)// Error here
}
В Objective-C:
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:(@"http://myURL/ios8.png")];
NSData *data = [NSData dataWithContentsOfURL:url];
_imageView.image = [UIImage imageWithData: data];
_labelURL.text = @"http://www.quentinroussat.fr/assets/img/iOS%20icon's%20Style/ios8.png";
}
Может кто-нибудь, пожалуйста, объясните мне, почему imageWithData:
не работает со Swift, и как я могу решить эту проблему.
imageURL.image = UIImage(data: myDataVar)
Ответы:
Xcode 8 или новее • Swift 3 или новее
Синхронно:
Асинхронный:
Создайте метод с обработчиком завершения, чтобы получить данные изображения из вашего URL
Создать метод для загрузки изображения (запустить задачу)
Применение:
Расширение :
Применение:
источник
UITableView
ячейке, где отображается изображение, и изображение обновляется при возврате из удаленной ячейки. Если процесс № 1 занимает больше времени, чем процесс № 2, процесс № 2 покажет свое изображение, а затем он будет обновлен процессом № 1, даже если это изображение больше не является действительным для пользователя.(Обновление Swift 4) Чтобы ответить непосредственно на оригинальный вопрос, вот быстрый эквивалент опубликованного фрагмента Objective-C.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:
Важно отметить, что
Data(contentsOf:)
метод будет загружать содержимое URL-адреса синхронно в том же потоке, в котором выполняется код, поэтому не вызывайте его в основном потоке вашего приложения.Простой способ заставить один и тот же код выполняться асинхронно, не блокируя пользовательский интерфейс, - использовать GCD:
Тем не менее, в реальных приложениях, если вы хотите иметь лучший пользовательский опыт и избегать многократной загрузки одного и того же изображения, вы можете также хотеть, чтобы они не только загружались, но и кэшировались. Уже есть довольно много библиотек, которые делают это очень легко, и все они действительно просты в использовании. Я лично рекомендую Kingfisher :
И это все
источник
image.url
любой URL-адрес строки, жестко или нет :)URLSession.dataTask
потому что многие другие ответы здесь уже показывают, как это сделать, лучше держать разные варианты открытыми.Если вы просто хотите загрузить изображение (асинхронно!) - просто добавьте это небольшое расширение к вашему быстрому коду:
И используйте это так:
источник
cancel
кнопку, он останавливает загрузку. У вас есть идея, как я могу сделать это с помощью этого метода? Мне нужно добавить функцию отмены.Swift 2.2 || Xcode 7.3
Он предоставляет несколько функций, таких как:
и очень легко реализовать для вашего приложения
Шаг 1 Установите модули
Alamofire 3.3.x
AlamofireImage 2.4.x
Step.2 импорт и использование
это оно!! это позаботится обо всем
Большое спасибо ребятам из Alamofire , за то, что они сделали жизнь iDevelopers легкой;)
источник
Xcode 8 • Swift 3
Ответ Лео Дабуса потрясающий! Я просто хотел предоставить функциональное решение «все в одном»:
источник
Я обернул код лучших ответов на вопрос в один, многократно используемый класс, расширяющий UIImageView, чтобы вы могли напрямую использовать асинхронную загрузку UIImageViews в вашей раскадровке (или создавать их из кода).
Вот мой класс:
и вот как это использовать:
источник
Swift 4 ::
Это покажет загрузчик при загрузке изображения. Вы можете использовать NSCache, который временно хранит изображение
Применение:-
источник
источник
fatal error: unexpectedly found nil while unwrapping an Optional value
К вашему сведению: для Swift-2.0 Xcode7.0 beta2
источник
swift 3 с обработкой ошибок
С расширением
Использование расширения
С поддержкой кэша
источник
Swift 4: простой загрузчик для небольших изображений (например, миниатюры), который использует NSCache и всегда работает в основном потоке:
Применение:
источник
class
.Вы хотите сделать:
В Swift они заменили большинство фабричных методов Objective C обычными конструкторами.
Видеть:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
источник
+(instancetype)[MyThing thingWithOtherThing:]
, вы бы также назвали его какMyThing(otherThing: ...)
в Swift.Swift 2 с дескриптором ошибки и пользовательским заголовком запроса
Просто добавьте расширение к UIImageView:
А затем использовать новый
imageFromUrl(urlString: String)
для загрузки изображенияПрименение:
источник
Swift 4
Этот метод загружает изображение с веб-сайта асинхронно и кэширует его:
В использовании:
источник
Swift 2.0:
1)
ИЛИ
2) Добавьте этот метод в VC или Extension.
Применение :
источник
URL Github - https://github.com/onevcat/Kingfisher
источник
Вот рабочий код для загрузки / скачивания изображения с URL. NSCache автоматически и отображать изображение заполнителя перед загрузкой и загружать фактическое изображение (код Swift 4).
Используйте как это:
источник
Метод получения изображения, который является безопасным и работает с Swift 2.0 и X-Code 7.1:
Затем вы бы назвали этот метод так:
Если вы обновляете представление с помощью изображения, вы должны будете использовать его после "if success {":
Причина, по которой эта последняя часть необходима, если вы используете изображение в пользовательском интерфейсе, заключается в том, что сетевые вызовы требуют времени. Если вы попытаетесь обновить пользовательский интерфейс с помощью изображения, не вызывая dispatch_async, как описано выше, компьютер будет искать изображение, пока изображение все еще выбирается, обнаружит, что изображения нет (пока), и будет двигаться, как если бы изображения не было нашел. Помещение вашего кода в закрытие завершения dispatch_async говорит компьютеру: «Идите, получите этот образ, а когда закончите, заполните этот код». Таким образом, у вас будет изображение при вызове кода, и все будет хорошо работать.
источник
Если вы ищете очень очень простую реализацию. (Это сработало для меня в Swift 2)
Я реализовал в табличном виде с пользовательской ячейкой, которая имеет только изображение
источник
Я рекомендую использовать библиотеку Kingfisher для асинхронной загрузки изображений. Лучшая часть использования Kingfisher заключается в том, что он кэширует все загруженные изображения по умолчанию с URL-адресом изображения в качестве идентификатора. В следующий раз, когда вы запросите загрузку изображения с этим конкретным URl, оно загрузит его из кэша.
Применение:
источник
Вы можете использовать стручок
SDWebImage
для достижения того же. Его легко использовать. Вы можете получить документацию здесь SDWebImageВот пример кода
источник
Свифт 5
для использования
источник
Единственное, чего там не хватает, это!
источник
Ответ Swift 2.x, который загружает изображение в файл (в отличие от ответа Лео Дабуса, который сохраняет изображение в памяти). На основе ответа Лео Дабуса и ответа Роба из Получить данные из NSURLSession DownloadTaskWithRequest из обработчика завершения :
источник
Swift 4.1 Я написал функцию, просто передайте URL изображения, ключ кеша после того, как изображение сгенерировано, установите его в блок завершения.
источник
Я создал в своем
Utils.swift
классе простую функцию класса для вызова этого метода, к которому вы можете просто получить доступ,classname.methodname
и ваши изображения сохраняются в NSCache с использованиемImageCaching.swift
классаУдачного Кодинга. Ура :)
источник
Swift 4.2 и AlamofireImage
Если использование библиотеки не является проблемой, вы можете сделать это с помощью
AlamofireImage
. мои образцы из его GithubПример изображения заполнителя:
у него много удобных функций и расширений для работы с изображениями. от кэширования до масштабирования и изменения размера или даже применения фильтров к изображению. если изображения важны в вашем приложении, я предлагаю использовать эту среду и сэкономить ваше время.
источник
С помощью Ascyimageview вы можете легко загрузить imageurl в imageview.
let image1Url: URL = URL (строка: "(imageurl)" как строка)! imageview.imageURL = image1Url
источник
Загрузка изображения с сервера: -
Применение :-
источник
Для повышения производительности
UITableView
илиUICollectionView
использования облегченной библиотеки Smart Lazy Loading Вы можете использовать этот подход с отложенной загрузкой, если вы хотите загружать изображения с URL-адреса. АсинхронныйУмная «отложенная загрузка» в
UICollectionView
илиUITableView
с использованиемNSOperation
иNSOperationQueue
в iOS Итак, в этом проекте мы можем загрузить несколько изображений в любом представлении (UICollectionView
илиUITableView
), оптимизируя производительность приложения с помощьюOperation
иOperationQueue
для одновременности. Вот ключевые моменты этого проекта Smart Lazy Loading: Создание сервиса загрузки изображений. Расставьте приоритеты загрузки на основе видимости ячеек.Класс ImageDownloadService создаст одноэлементный экземпляр и будет иметь экземпляр NSCache для кэширования загруженных изображений. Мы унаследовали класс Operation от TOperation, чтобы изменить функциональность в соответствии с нашими потребностями. Я думаю, что свойства подкласса операции довольно понятны с точки зрения функциональности. Мы отслеживаем изменения состояния операций с помощью КВО.
источник