我怎么知道何时将从持久商店中删除nsmanagebject



因此,为了节省空间和缓存的目的,我在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的上述答案也可以。

最新更新