核心数据获取NSManagedObject的修改date?

在为我的核心数据存储中的每个实体添加一个NSDate属性之外,是否有编程方法来获取任何对象的修改date?

不,您必须添加date并自行pipe理。 您可以在托pipe对象中使用override -willSave来更新时间戳,但在-willSave读取NSManagedObject的API文档以获取如何更新而不会导致willSave循环(文档甚至讨论更新时间戳的情况)。 该文档还提到使用NSManagedObjectContextWillSaveNotification ,但这可能比设置更麻烦,比简单的检查没有太快设置时间戳。

请注意这个解决scheme假设我们有一个名为dateUpated的属性在模型中。

而不是在个别的对象处理这个。 我会通过通知来处理这个问题。 苹果的文档也提出了这种方式。

1.注册NSManagedObjectContextWillSaveNotification通知

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willSaveContext:) name:NSManagedObjectContextWillSaveNotification object:nil]; 

2为每个更新对象的observer方法设置updatedDate的属性。

 - (void)willSaveContext:(NSNotification *)notification{ NSManagedObjectContext *context = [notification object]; NSSet *updatedObject = [context updatedObjects]; for (NSManagedObject *managedObject in [updatedObject allObjects]) { if ([[managedObject.entity propertiesByName] objectForKey:@"dateUpdated"]) { [managedObject setValue:[NSDate date] forKey:@"dateUpdated"]; } } } 

我个人检查updatedAt被修改,如果是,那么我不再触摸它。 这样我打破了willSave循环。

 - (void)awakeFromInsert { [super awakeFromInsert]; self.primitiveUpdatedAt = [NSDate date]; } - (void)willSave { [super willSave]; if(![self isDeleted] && self.changedValues[@"updatedAt"] == nil) { self.updatedAt = [NSDate date]; } } 

我发现这个Q / A有助于开始设置核心数据中修改date的属性。 在这个过程中,我遇到了一些可能有所帮助的提示:

(技巧1:避免willSaverecursion)

  • 避免使用willSave循环的另一种方法是编写一个自定义例程,用于保存遍历其updatedObjects的上下文,以查找具有dateModified属性并设置它的那些上下文。 做实际的调用commitEditing并在循环之后save 。 不要打扰一切保存。

(提示2:实时更新 – 但不能撤消)

  • 如果您需要实时更新以在表中显示修改为用户的date,则还可以在objectValueForTableColumn委托方法(willDisplayCell for iOS)中的switch-case(或其他)中为date修改列设置dateModified。

  • 在那里,testing该行的对象是否已更新,如果是,则设置dateModified。 我怀疑if (obj isUpdated)检查是非常昂贵的。 但一定要这样做,只为相关的专栏,以免不必要的重复。

  • 返回您正在使用的列的任何string表示forms。 为了避免实际修改时间和date设置之间的明显差异,只显示date,而不是时间。

  • 这将导致dateModified在用户进行表格select时以及表格重新加载时更新。 哪一个不完美 – 如果用户修改了表中没有表示的属性,该列将不会更新,直到他们做出select。 但是,它比实施广泛的KVO计划的响应速度更快,更容易。

  • (您仍然希望在保存例程中设置date,以捕捉表格中不可见的修改。)

  • 撤消操作:不幸的是,撤销pipe理器会将表格委托方法的修改视为自己的事件。 随后调用撤消只是撤消最后的变化dateModified – 一遍又一遍。 我试图通过添加一个跟踪器和一个非空的changedValues字典检查克服这一点,以确保dateModified只有一次预保存设置。 这用于撤消删除,但不适用于定期编辑。 所以没有快速完成dateModified预保存实时更新的方法。

如果有人想在Swift中做一个简单的方法:我写了一篇关于一个简单的UpdateListener类的博客文章来更新所有的updateDateinsertDate属性。 你可以在这个要点find整个class级。 您只需在application(:didFinishLaunchingWithOptions:)程序委托的application(:didFinishLaunchingWithOptions:)方法中调用UpdateListener.setupSharedInstance()

Interesting Posts