Вы никогда не должны предоставлять сетевой URL инициализатору, который должен использовать ресурсы, извлеченные из этого URL.Предполагается, что сетевые запросы выполняются асинхронно, в то время как инициализаторы должны возвращаться синхронно, поэтому у вас возникают проблемы при предоставлении удаленных URL-адресов методам, которые ожидают локальный URL-адрес.
Более того, нет необходимости вAVURLAsset
, если вы просто хотите загрузить изображение и отобразить его как UIImage
.Вы можете просто использовать URLSession.dataTask
для загрузки изображения.
Вы можете использовать это расширение UIImage
для асинхронной загрузки изображения:
extension UIImage {
static func downloadFromRemoteURL(_ url: URL, completion: @escaping (UIImage?,Error?)->()) {
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil, let image = UIImage(data: data) else {
DispatchQueue.main.async {
completion(nil,error)
}
return
}
DispatchQueue.main.async {
completion(image,nil)
}
}.resume()
}
}
Затем используйте его для получения уменьшенного изображения, например:это:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellRID") as! VideoAdsCell
let youtubeId = extractYoutubeIdFromLink(link: arrayVideo[indexPath.row].video)
if let url = URL(string: "http://img.youtube.com/vi/\(youtubeId!)/1.jpg") {
print(url)
UIImage.downloadFromRemoteURL(url, completion: { thumbnail,error in
guard let thumbnail = thumbnail, error == nil else {
print(error)
return
}
cell.imageForMain.image = thumbnail
cell.viewForMain.layer.masksToBounds = false
cell.viewForMain.layer.shadowOffset = CGSize(width: -1, height: 1)
cell.viewForMain.layer.shadowRadius = 1
cell.viewForMain.layer.shadowOpacity = 1
cell.viewForMain.layer.cornerRadius = 8
}
}
return cell
}