Для вашего решения
Создайте переменную videoModel
в своем классе UICollectionViewCell
и удалите вызов fetchRequest
в классе UICollectionViewCell
, который вызывает проблему,
var videoModel: VideoModel? {
didSet {
titleLabel.text = videoModel?.videoTitle
let playerVars: [String : Any] = [
"playsinline" : 0,
"enablejsapi": 1,
"wmode": "transparent",
"controls": 1,
"showinfo": 0,
"rel": 0,
"modestbranding": 1,
"iv_load_policy": 3 //annotations
]
self.player.load(withVideoId: videoModel?.videoId ?? "", playerVars: playerVars)
}
}
Файл
ViewModel
должен выглядеть следующим образом:
import Foundation
struct VideoModel {
var videoTitle: String?
var videoId: String?
init(title: String, id: String) {
videoTitle = title
videoId = id
}
}
Затем в SearchViewController
создайте массив viewModels
и назначьте videoModel
свою ячейку в методе cellForItemAt
источника данных,
var videoModels = [VideoModel]()
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: videoId, for: indexPath) as! SearchVideoCell
let video = videos[indexPath.row]
cell.delegate = self
cell.video = video
cell.videoModel = videoModels[indexPath.row]
return cell
}
Наконец, в fetchVideosWith
добавьте viewModel
к вашему массиву viewModels
,
//MARK:- Fetch Data
fileprivate func fetchVideosWith(title name: String) {
let params = ["part": "snippet", "q": "tausiyah \(name)", "key": "AIzaSyC2mn0PTL8JmSWEthvksdJLvsnwo5Tu9BA"]
APIServices.shared.fetchData(url: APIServices.youtubeBaseURL, params: params, of: Item.self) { (items) in
let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateContext.parent = CoreDataManager.shared.persistenceContainer.viewContext
var newVideos = [Video]()
items.forEach({ (item) in
let video = Video(context: privateContext)
video.title = item.snippet.title
video.videoId = item.id.videoId
newVideos.append(video)
do {
try privateContext.save()
try privateContext.parent?.save()
} catch let saveErr {
print("Failed to save json data:", saveErr)
}
let videoModel = VideoModel(title: item.snippet.title, id: item.id.videoId)
self.videoModels.append(videoModel)
})
DispatchQueue.main.async {
self.videos = newVideos
self.collectionView.reloadData()
self.showLoadingHUD()
}
}
}
Надеюсь, это поможет.