如何在NSManagedObject的单个实例上观察更改

在这篇文章中,我将描述如何观察单个NSManagedObject实例的变化。 我写这篇文章的动机是我的朋友,他问我:

“您如何观察CoreData中单个对象的变化? 我知道这里有NSFetchedResultsController,但是值得只观察一个对象吗?!”

当然可以使用NSFetchedResultsController,但是它是为不同的事物创建的,如果您阅读文档,则可以找到以下内容:

“您使用提取的结果控制器来有效地管理从Core Data提取请求返回的结果,以提供UITableView对象的数据。 (…)尽管可以以多种方式使用表视图,但访存结果控制器主要用于帮助您使用主列表视图。

我的答案是-不要这样。 最有效的方法是观察NSManagedObjectContextObjectsDidChangeNotification 。 当上下文中托管对象的属性值更改时,将发布此通知。 userInfo词典包含以下键: NSInsertedObjectsKeyNSUpdatedObjectsKeyNSDeletedObjectsKey,NSRefreshedObjectsKey 。 如果已经熟悉此方法,则可以看一下我们的包装器,它可以避免编写样板代码。 我根据源代码做了要点,您可以在文章下面和此处找到源代码。 这是我们的观察者界面的样子:

它非常易于使用,您所需要做的就是创建CoreDataContextObserver实例并传递要观察的上下文:

 让上下文= NSManagedObjectContext.defaultContext 
让观察者= CoreDataContextObserver(context:context)

接下来,您需要传递将要观察的NSManagedObject实例,如果发生更改,您将在完成处理程序中获取有关该实例的信息:

  observer.observeObject(journal,completionBlock:{对象,状态为 
打印(“更改:\(object.changedValuesForCurrentEvent())\ n”)
打印(“状态:\(状态)”)
})

CoreDataContextObserver不仅限于一个对象,您可以观察到处于不同状态的许多对象,例如,如果您想了解日记帐删除,则将观察到。 删除状态:

  reader.observeObject(journal,state:.Deleted,completeBlock:{object,state in 
打印(“对象已删除\ n”)
})

这样,您就可以以干净的方式跟踪NSManagedObject上的所有更改。 我在我们的github上创建了示例项目,您可以在其中使用CoreDataContextObserver。

我想说的是,如果您使用

  func mergeChangesFromContextDidSaveNotification(_ notification :NSNotification!) 

那么您将获得NSRefreshedObjectsKey中的更改 因此,如果您想使用我们的观察员订阅此事件,将使用:

  reader.observeObject(journal,state:.Refreshed,completeBlock:{object,state in 
打印(“刷新对象”)
})

如果您发现这些资源很有用,或者您是个很棒的人,请按 💚 在这里,您将找到 示例项目 ,在下面,您将找到完整的源代码: