Я знаю, что SDWebImage
загружает изображение в фоновом потоке, поэтому вы не блокируете пользовательский интерфейс / основной поток во время этой загрузки.Кроме того, он также будет кэшировать на диске все загруженные вами изображения и НИКОГДА не будет повторно загружать изображение с того же URL
.
Так что мне интересно, есть ли что-то подобное или то же самое для видео?
Что стоит отметить: Я добавляю видео в качестве подслоя.
let videoURL = URL(string: postArray[indexPath.item].media[0].videoURLString!)//need to do error handlin here
print(videoURL as Any, "<-- video url in dispkay")
let player = AVPlayer(url: videoURL! as URL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = CGRect(x: -8, y: 0, width: 138, height: 217)//cell.frame
cell.imageOrVideoView.layer.addSublayer(playerLayer)
//Other code and play()
Это было рекомендовано в прошлом, но кажется, что он делает что-то другое или у самого арендованного слишком много дополнительной функциональности, которая мне не нужна.
Обновление:
Что я тестирую:
DispatchQueue.global(qos: .default).async(execute: {
var downloadedData: Data? = nil
if let url = URL(string: videoURL) {
do {
downloadedData = try Data(contentsOf: url)
} catch {
print(error, "downloaded Data failed")
}
}
if downloadedData != nil {
// STORE IN FILESYSTEM
var cachesDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
var file = URL(fileURLWithPath: cachesDirectory).appendingPathComponent(videoURL).absoluteString
do {
try downloadedData?.write(to: URL(string: file)!)
} catch {
print(error, "error dowloading data and writing it")
}
// STORE IN MEMORY
if let downloadedData = downloadedData {
memoryCache?.setObject(downloadedData as AnyObject, forKey: videoURL as AnyObject)
}
}
// NOW YOU CAN CREATE AN AVASSET OR UIIMAGE FROM THE FILE OR DATA
})
Я не понимаю, следует ли мне делать что-то сразу после последней строки илиесли я должен сделать это после}) или если мне нужно добавить там интерфейс обновления.