NSFetchedResultsController controllerDidChangeContent从未调用

时间:2018-11-29 19:12:10

标签: swift core-data

我在实现非常基本的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 :(得分:1)

let controller = NSFetchedResultsController(...)

viewDidLoad中创建一个局部变量。一旦程序控制 从该函数返回,没有对提取的结果控制器的强引用 已经存在了,它被摧毁了。

解决方案是使controller成为视图控制器的 instance属性