我在实现非常基本的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
。
我在这里错过了一些琐碎的事情吗?
谢谢
答案 0 :(得分:1)
let controller = NSFetchedResultsController(...)
在viewDidLoad
中创建一个局部变量。一旦程序控制
从该函数返回,没有对提取的结果控制器的强引用
已经存在了,它被摧毁了。
解决方案是使controller
成为视图控制器的 instance属性。