更新回调之前的核心数据

时间:2014-06-09 12:20:25

标签: objective-c core-data callback

我的实体都具有createdAtupdatedAt属性。我想要做的是在插入/更新时自动设置这些属性的值。

在做了一些研究之后,我发现有一个awakeFromInsert方法可以在创建新对象时自动设置createdAt属性的值。

但是,我找不到更新对象的类似内容。所以我该怎么做?我是否每次都必须手动更新updatedAt属性?

2 个答案:

答案 0 :(得分:0)

这取决于你想要达到的目标。仅在保存时更新,您可以在以下位置进行更新:

-(void)willSave;

请记住,修改此地点的属性会再次调用willSave。因此,您只需更新updatedAt一次。此外,您必须检查对象是否已删除 - isDeleted

您还可以观察所有属性,并将updatedAt设置为真正更新时的日期,而不是保存。

答案 1 :(得分:0)

我最终在StackOverflow(https://stackoverflow.com/a/10723861/123016https://stackoverflow.com/a/4590190/123016)上找到了类似的问题/答案。我根据自己的需要调整了建议的解决方案。

我最初做的是创建一个抽象实体,我将其用作所有其他实体的父类。此抽象类有两个属性:createdAtupdatedAt

然后我将以下代码添加到抽象类的实现中:

- (void)awakeFromInsert
{
    [super awakeFromInsert];

    self.createdAt = [NSDate date];
}

+ (void)load
{
    @autoreleasepool {
        [[NSNotificationCenter defaultCenter] addObserver:(id)self.class
                                                 selector:@selector(objectContextWillSave:)
                                                     name:NSManagedObjectContextWillSaveNotification
                                                   object:nil];
    }
}

+ (void)objectContextWillSave:(NSNotification *)notification
{
    NSManagedObjectContext *context              = [notification object];
    NSSet                  *allObjects           = [context.insertedObjects setByAddingObjectsFromSet:context.updatedObjects];
    NSPredicate            *predicate            = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [self class]];
    NSSet                  *allModifiableObjects = [allObjects filteredSetUsingPredicate:predicate];

    [allModifiableObjects makeObjectsPerformSelector:@selector(setUpdatedAt:) withObject:[NSDate date]];
}

除了我将父类抽象化之外,这与两个答案的组合完全相同。