如何知道何时从永久性存储中删除NSManagedObject?

问题描述:

因此,为了节省空间和缓存,我在CoreData中定义了一个Photo模型,该模型的属性为imageDataURL(fileURL)。如何知道何时从永久性存储中删除NSManagedObject?

该数据将存储在文档目录中。因此,如果用户删除了Photo对象,我想确保清理该数据。

我的问题是,我应该在哪里看到deleteDataAtImageURL(...)方法?

我想这将是在NSManagedObjectprepareForDeletion()方法,我是否该对象的上下文的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) 
      } 
     } 
     } 
    } 
    } 
+0

这就是如果你有一个root保存上下文。我正在使用最新的iOS 10样板(NSPersistentContainer)。我想这将是我的根节能环境。我最好喜欢模型来照顾自己的清理。这是更好的封装。 – horseshoe7