NSFetchedResultsControllerDelegate метод не вызывается при переключении вкладки - PullRequest
0 голосов
/ 14 апреля 2020

Мое приложение имеет две панели вкладок. Первая представляет список игр, добавленных на контроллере представления, и сохраняет их в базе данных ядра. Включение второй вкладки / представления считывает из базы данных и представляет ее внутри табличного представления. Я реализовал NSFetchedResultsControllerDelegatewith метод выборки. Но всякий раз, когда я добавляю или вставляю элемент в контекст на первой вкладке и переключаюсь на вторую вкладку, методы делегата FR C не вызывают. Но когда я внедряю те же методы на первой вкладке, я вижу, что они вызывают, когда я вносил изменения в базу данных.

    import UIKit
    import CoreData

    class AllWLeagueController : UITableViewController {

        var fetchRequestController : NSFetchedResultsController<GameMo>!
        var arrayOfGamesModel : [[GameMo]]? = []
        var gameMo: GameMo?
        var gamesMo: [GameMo] = []


        override func viewDidLoad() {
            validation(object: arrayOfGamesModel)

        }

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



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


            return arrayOfGamesModel?.count ?? 0
        }
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



            if let weekL = arrayOfGamesModel?[indexPath.row] {
                if let cell = tableView.dequeueReusableCell(withIdentifier: "WL") as? AllWLeaguesTableViewCell {
                    let winCounts = WLManager.winCountMethod(from: weekL)
                    let lossCounts = WLManager.lossCountMethod(from:weekL)
                    cell.setOulet(win: winCounts, loss: lossCounts, rankName: rankString)

                    cellLayer(with: cell)
                    return cell
                }
            }

   }



  extension AllWLeagueController: NSFetchedResultsControllerDelegate {

        func fetchRequest ()  {
            let fetchRequest = NSFetchRequest<GameMo>(entityName: "Game")

            fetchRequest.sortDescriptors = [NSSortDescriptor(key: "win", ascending: true)]

            if let appDelegate = (UIApplication.shared.delegate as? AppDelegate){
                let context = appDelegate.persistentContainer.viewContext

                // fetch result controller
                fetchRequestController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
                fetchRequestController.delegate = self

                do{
                    try fetchRequestController.performFetch()

                    if let fetchedObjects = fetchRequestController.fetchedObjects {
                        gamesMo = fetchedObjects


                        print("Fetech Request Activated")
                        print(gamesMo)
                    }
                }catch{
                    fatalError("Failed to fetch entities: \(error)")
                }
            }

        }


        func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
            print("TableView beginupdates")
            tableView.beginUpdates()
        }

        func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
            switch type {
            case .insert:
                if let newIndexPath = newIndexPath {
                    print("insert")
                    tableView.insertRows(at: [newIndexPath], with: .fade)

                }
            case .delete:
                if let indexPath = indexPath {
                     print("delete")
                    tableView.deleteRows(at: [indexPath], with: .fade)
                }
            case .update:
                if let indexPath = indexPath {
                     print("update")
                    tableView.reloadRows(at: [indexPath], with: .fade)

                }

            default:
                tableView.reloadData()
            }

            if let fetchedObjects = controller.fetchedObjects {
                gamesMo = fetchedObjects as! [GameMo]

            }
        }


        func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
            print("TableView endupdates")
            tableView.endUpdates()
        }
     }

1 Ответ

0 голосов
/ 14 апреля 2020

Похоже, ваш fetchedResultsController обновляет gamesMo, но ваш tableView смотрит на arrayOfGamesModel. Но arrayOfGamesModel никогда не обновляется.

Вы можете либо изменить свои tableView методы, чтобы посмотреть на gamesMo, либо изменить fetchedResultsController, чтобы обновить arrayOfGamesModel.

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