如何知道何时从永久性存储中删除NSManagedObject?
问题描述:
因此,为了节省空间和缓存,我在CoreData中定义了一个Photo
模型,该模型的属性为imageDataURL
(fileURL)。如何知道何时从永久性存储中删除NSManagedObject?
该数据将存储在文档目录中。因此,如果用户删除了Photo
对象,我想确保清理该数据。
我的问题是,我应该在哪里看到deleteDataAtImageURL(...)
方法?
我想这将是在NSManagedObject
的prepareForDeletion()
方法,我是否该对象的上下文的父是nil
。这告诉我这是直接与持久性商店联系的上下文。
这应该工作,除非用户重置上下文并且不保存它。
我无法想象我是第一个想要做到这一点的人,所以对此方法的任何建议(或更好的建议!)将不胜感激!
答
到底对我的解决办法是覆盖prepareForDeletion和检查对象的.managedObjectContext.parent
属性是零。这告诉我它已连接到PersistentStore,并且可以执行我想要的任务。
我不知道这是否是最佳实践,但它是有效的。
我相信从sschale上面的答案也将工作,虽然我没有尝试它。
答
我有类似的问题。以下是我如何通过使用NotificationCenter观察器来解决这个问题,以便对我的根节点上下文进行操作。
//done as part of a singleton class setup
NotificationCenter.default.addObserver(self, selector: #selector(SingletonClass.handleModelDataChange), name:NSNotification.Name.NSManagedObjectContextObjectsDidChange, object: yourRootSavingContext)
internal func handleModelDataChange(notification: NSNotification) {
//get documents directory
let documentsURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
//get deleted items from dictionary
if let deleted = notification.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject> , deleted.count > 0 {
for object in deleted{
//sort out your objects of interest, I cared about objects of a certain class
if ...{
do {
//delete filepath
try FileManager.default.removeItem(at: documentsURL.appendingPathComponent(myPathComponent, isDirectory: true))
//print("Deleted the folder \(documentsURL.URLByAppendingPathComponent(myPathComponent, isDirectory: true))")
}
catch {
//print("I tried :(")
print(error)
}
}
}
}
}
这就是如果你有一个root保存上下文。我正在使用最新的iOS 10样板(NSPersistentContainer)。我想这将是我的根节能环境。我最好喜欢模型来照顾自己的清理。这是更好的封装。 – horseshoe7