首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSManagedObject timeStamp更新

NSManagedObject timeStamp更新
EN

Stack Overflow用户
提问于 2014-01-24 10:22:19
回答 3查看 1.5K关注 0票数 4

我希望跟踪NSManagedObject属性的更改,以便使NSData *lastUpdate属性“最新”

当NSManagedObject更改其属性时,有几种方法可以得到通知

首先是覆盖要跟踪的所有属性的setter方法。这在NSManaged对象中是相当复杂的??请检查它here

二、第二种可能是好的。您可以只覆盖对每个属性更改调用的"didChangeValueForKey“方法。

代码语言:javascript
复制
-(void)didChangeValueForKey:(NSString *)key{
    [super didChangeValueForKey:key];
    NSLog(@"Value for key:%@ has changed", key);
}

不幸的是,我们不应该覆盖这个方法,因为文档中写着:

“您不能重写此方法。”

关键-价值-观察带领我们回到IInd方法,以压倒"didChangeValueForKey“。

upd。我试图覆盖-willSave方法

代码语言:javascript
复制
-(void)willSave{
   NSArray *observedKeys = @[@"name", @"imageType"];
   NSDictionary * changesALL = self.changedValues;
   for (id key in changesALL){
       if ([observedKeys containsObject:key]){
           self.lastUpdate = [NSDate date];
           NSLog(@"updated For key: %@", key);
        }
    }
}

这导致了不定式循环,这在文档中有描述。(这里也描述了正确的方法,所以我已经回答了这个问题)

如果要更新持久属性值,通常应在进行更改之前测试任何新值与现有值的相等性。如果使用标准访问器方法更改属性值>值,核心数据将观察结果更改>通知,因此在保存对象的托管对象>上下文之前再次调用willSave。如果您继续修改willSave中的值,willSave将继续被调用>,直到程序崩溃。 例如,如果您设置了最后修改的时间戳,则应该检查您是否>以前在相同的保存操作中设置了时间戳,或者现有的时间戳是否小于当前时间中的一个小增量。通常,最好为保存的所有对象计算时间戳>一次(例如,响应一个>NSManagedObjectContextWillSaveNotification)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-13 12:27:53

因此,我发现跟踪托管对象更改的最佳解决方案是注册NSManagedObjectContextWillSaveNotification,并在托管对象上下文中对所有已更新和插入的对象设置时间戳。注册的方法可以如下所示:

代码语言:javascript
复制
-(void)contextWillSave:(NSNotification *)notify
{
NSManagedObjectContext *context = [notify object];
NSDate *dateOfTheLastModification = [NSDate date];
for (NSManagedObject *obj in [context insertedObjects]) {
    [obj setValue:dateOfTheLastModification forKey:@"lastUpdate"];
}
for (NSManagedObject *obj in [context updatedObjects]) {
    [obj setValue:dateOfTheLastModification forKey:@"lastUpdate"];
}
}

这假设所有实体都有一个lastModifiedDate属性,否则必须检查对象的类。

票数 2
EN

Stack Overflow用户

发布于 2014-01-24 10:35:23

一个适合用例的解决方案来覆盖willSave方法并使用它来设置新的lastUpdated值。在将脏对象保存到上下文之前,将自动调用此方法。

如果需要验证什么是脏的,可以使用changedValues属性的内容。

票数 4
EN

Stack Overflow用户

发布于 2014-11-06 23:41:16

为了避免无限循环,请尝试以下魔术:

代码语言:javascript
复制
- (void)willSave{
    if(![self.changedValues objectForKey:@"localModificationDate"]){
        self.localModificationDate = [NSDate date];
    }
    else{
        [super willSave];
    }
}

一旦修改日期被设置,它将不再为当前保存设置它。有一个副作用是,如果保存失败,而您再次成功保存,则我估计日期将是上次保存尝试的日期。

如果您在每次编辑之后保存上下文,这是很好的,但是核心数据的通常设计是只在应用程序挂起时或在很长时间后保存。因此,在此之前,lastUpdate很可能是需要的,而且还没有新的价值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21330119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档