我现在完全没办法了大约一个星期了。
我有一个带有多个协调器和托管上下文的CoreData堆栈,我正在尝试在应用程序中实现注销功能。
与CoreData交互的tableviews位于TabBarController中,并且有引导它的入职(即注册和登录)导航控制器和ViewControllers。
我试图实现的是注销(即展开到初始ViewController)。到目前为止,我一直在努力——但没有成功:
reset()每个managedObjectContext单独
tableView.beginUpdates()、tableView.endUpdates()、tableView.reloadData()、frc.performFetch()的所有可能组合
删除每个managedObject中的每个实体,然后分别重置每个managedObjectContext
将tableView、fetchedResultsController委托和数据源设置为nil,然后在viewDidLoad()上设置为self
在注销之前触发NSNotification—删除CoreData中的所有内容并保存它,有效地更新和清空表。
更多
有没有一种方法可以完全重置CoreData,这样当用户释放到初始ViewController并重新运行整个过程时,我就不会得到
严重的应用程序错误。在核心数据期间捕获异常
变更处理。这通常是
NSManagedObjectContextObjectsDidChangeNotification。尝试插入
第9行进入第0节,但在
用userInfo更新(空)
或者在我通过通知清空表的情况下:
严重的应用程序错误。在核心数据期间捕获异常
变更处理。这通常是
NSManagedObjectContextObjectsDidChangeNotification。尝试插入
第9行进入第0节,但在
用userInfo更新(空)
如果我注销、关闭应用程序并重新启动,CoreData就可以正常工作。这样没有错误。这使我认为有一种方法可以完全重置CoreData(以及与之关联的任何表视图、fetchedresultscontroller)或在展开到初始ViewController时重置为原始状态。
或者我应该复制故事板,并有一个单独的一套用于注销的入站视图控制器,这样CoreData就不会重新初始化了?
有什么想法吗?谢谢。
最佳答案
在iOS9及以上版本中,您可以使用destroyPersistentStore
并可以选择添加一个新的
func destroyAllData(storeType : String = NSSQLiteStoreType) throws {
guard let storeURL = persistentStoreCoordinator.persistentStores.last?.url else {
print("Missing store URL")
return
}
try persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: storeType)
// try persistentStoreCoordinator.addPersistentStore(ofType: storeType, configurationName: nil, at: storeURL)
}