Инкапсулированный основной объект данных - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть данные json, сохраненные в основных данных и сохраненные в массиве, и я хочу инкапсулировать массив, сохраненный в основных данных.проблема в том, что когда я хочу отобразить его в приложении, он получает только 1 данные в массиве.Предположим, у меня есть 5. Здесь я показываю мой код

, это мой запрос на выборку функции мои данные json

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)
                }
            })
            DispatchQueue.main.async {
                self.videos = newVideos
                self.collectionView.reloadData()
                self.showLoadingHUD()
            }
        }

Это мой код инкапсулирован в моей коллекцииViewCell

var video: Video? {
    didSet{
        let context = CoreDataManager.shared.persistenceContainer.viewContext
        let fetchRequest = NSFetchRequest<Video>(entityName: "Video")

        do {
           let videos = try context.fetch(fetchRequest)
            videos.forEach { (video) in
                titleLabel.text = video.title
                guard let videoId = video.videoId else { return }
                DispatchQueue.main.async {
                    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: videoId, playerVars: playerVars)
                }
            }
        } catch let fetchErr {
            print("Failed to fetch video:", fetchErr)
        }
    }
}

после того, как я получаю основные данные и пытаюсь распечатать видео внутри видео. Для каждого значения есть не только одно значение.но когда я пытаюсь загрузить с YouTube Player, он отображает только одно значение.

only one object return

1 Ответ

0 голосов
/ 30 декабря 2018

Для вашего решения

Создайте переменную 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()
                }
            }
    }

Надеюсь, это поможет.

...