因此,为了节省空间和缓存的目的,我在Coredata中定义了具有属性imageDataURL
(fileurl)的Photo
模型。
此数据将存储在文档目录中。因此,我想确保如果用户删除Photo
对象。
我的问题是,我应该在哪里拥有deleteDataAtImageURL(...)
方法?
我认为它将在NSManagedObject
上的prepareForDeletion()
方法中,并且我检查该对象的上下文的 parent 是 nil
。这告诉我,这是直接与持久商店接触的上下文。
这应该有效,除非用户重置上下文并不能保存上下文。
我无法想象我是第一个想这样做的人,因此对此方法(或更好的方法!)的任何建议都将不胜感激!
我也有类似的问题。这是我通过使用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)
}
}
}
}
}
最后,我的解决方案是覆盖preparefordertion,并检查对象的 .managedObjectContext.parent
属性是否为nil。这告诉我它与PersistentStore连接在一起,我可以完成我想做的任务。
我不知道这是否是最佳实践,但它正在起作用。
我相信,尽管我没有尝试过,但Sschale的上述答案也可以。