NSFetchedResultsController controllerDidChangeContent никогда не вызывается - PullRequest
0 голосов
/ 29 ноября 2018

У меня проблемы с реализацией очень простого NSFetchedResultsController.У меня есть следующее супер простое демо-приложение, настроенное только с одним представлением и кнопкой, реализация стека CoreData - это та, которая автоматически генерируется Xcode.

class ViewController: UIViewController, NSFetchedResultsControllerDelegate {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set up the NSFetchedResultsController.
        let fetchRequest = NSFetchRequest<Demo>(entityName: "Demo")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:  appDelegate.persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil)

        // Delegate is set!
        controller.delegate = self

        do {
            try controller.performFetch()
            print(controller.fetchedObjects?.count) // This prints the correct count when restarting the app.
        } catch {
            fatalError("Failed to fetch entities: \(error)")
        }
    }

    @IBAction func addNewPressed(_ sender: Any) {

        NSEntityDescription.insertNewObject(forEntityName: "Demo", into: appDelegate.persistentContainer.viewContext)

        // Save the context
        do {
            try appDelegate.persistentContainer.viewContext.save()
        } catch {
            print(error)
        }
    }

    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
        print("called") // NEVER CALLED!
    }

}

Когда вызывается addNewPressed, новый объектвставлен и сохранен.Однако controllerDidChangeContent никогда не вызывается.

Я что-то упускаю здесь тривиально?

Спасибо

1 Ответ

0 голосов
/ 29 ноября 2018
let controller = NSFetchedResultsController(...)

создает локальную переменную в viewDidLoad.Как только программный элемент управления возвращается из этой функции, более не существует надежных ссылок на контроллер полученных результатов, и он уничтожается.

Решение состоит в том, чтобы controller свойство экземпляра контроллера представления.

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