У меня возникла проблема с отображением последних сохраненных данных CoreData в tableView - PullRequest
0 голосов
/ 25 апреля 2020

Я сохраняю данные из MovieDetailViewController в coreData. Я пытаюсь получить доступ к данным coreData с другого контроллера. Когда я сохраняю данные в coreData и переключаюсь на другой контроллер, где я выводю результат в tableView, он не показывает мне вновь сохраненные имена там. Когда я удаляю фон и снова открываю его, он показывает последние сохраненные данные.

Мне нужно что-то похожее на метод tableView tableView.reloadData().

class MovieDetailViewController: UIViewController {

    var coreDataMovieName: [NSManagedObject] = []
    var movie: Movie!
    var detailsImageView: UIImage!
    var movieName = ""


    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = movie.title

        //Detalebshi Photos gamochena
        if let posterPath = movie.posterPath {
            TMDBClient.downloadPosterImage(path: posterPath) { (data, error) in
                guard let data = data else {
                    return
                }
                let image = UIImage(data: data)
                self.imageView.image = image
                self.detailsImageView = image
            }
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }

        let managedContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Favorite")
        do {
            coreDataMovieName = try managedContext.fetch(fetchRequest)
        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    }


    func save(name: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }
        let managedContext = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "Favorite", in: managedContext)!
        let person = NSManagedObject(entity: entity, insertInto: managedContext)
        person.setValue(name, forKeyPath: "movieName")

        do {
            try managedContext.save()
            coreDataMovieName.append(person)
            print("saved \(person)")
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }

    @IBAction func coreDataFavoritesBtnTapped(_ sender: Any) {
        save(name: movieName)
    }
}

Контроллер, к которому я пытаюсь получить доступ к Core Data:

class CoreDataFavoritesViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!


    var movie: [NSManagedObject] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "The List"
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.dataSource = self
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }

        let managedContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Favorite")

        do {
            movie = try managedContext.fetch(fetchRequest)

        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    }
}

// MARK: - UITableViewDataSource

extension CoreDataFavoritesViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


        return movie.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let person = movie[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = person.value(forKeyPath: "movieName") as? String
        return cell
    }
}

1 Ответ

3 голосов
/ 25 апреля 2020

Вы добавляете данные после сохранения контекста

 coreDataMovieName.append(person)

сделайте это до

try managedContext.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...