获取Core Data中NSManagedObject的修改日期?

Jas*_*son 15 iphone core-data last-modified nsmanagedobject ios

除了向我的Core Data存储中的每个Entity添加NS​​Date属性之外,是否有一种编程方式来获取任何对象的修改日期?

Ken*_*ner 21

不,您必须添加日期并自行管理.您可以-willSave在托管对象中使用override 来更新时间戳,但是请阅读NSManagedObject的API文档,-willSave了解如何在不引起willSave循环的情况下进行更新(文档甚至讨论更新时间戳的情况).文档也提到了使用NSManagedObjectContextWillSaveNotification,但设置起来可能比简单检查更麻烦,不能过快地设置时间戳.

  • Apple举例说明了如何做到这一点.阅读-willSave:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html (3认同)
  • 这是一个更新的链接:https://developer.apple.com/documentation/coredata/nsmanagedobject/1506209-willsave (2认同)

Ben*_*air 7

我亲自检查是否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];
    }
}
Run Code Online (Sandbox Code Playgroud)


Mad*_*Nik 6

请注意,此解决方案假设我们在模型中有一个名为dateUpated的属性.

而不是在单个对象处理此问题.我会通过通知来处理这个问题.Apple文档也提供了这种方式.

1.注册NSManagedObjectContextWillSaveNotification通知

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(willSaveContext:)         
                                             name:NSManagedObjectContextWillSaveNotification 
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

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"];
        }

    }

}
Run Code Online (Sandbox Code Playgroud)


Dio*_*o T 6

在 WWDC19 上宣布了 派生属性

updatedCore Data 会自动更新这样的属性:

核心派生属性截图

注意:这可能会产生无效的Mapping Model