Core Data NSManagedObject 关联计数缓存?

Posted

技术标签:

【中文标题】Core Data NSManagedObject 关联计数缓存?【英文标题】:Core Data NSManagedObject association count cache? 【发布时间】:2011-08-15 21:13:43 【问题描述】:

我正在为 (Foo)NSManagedObject 的关联 (Bar) 设置计数缓存。在对象 Foo 中,我想计算它有多少个 Bars。我想避免每次我需要知道有多少 Bars Foo 时都访问数据库(我经常访问它)。我的方法是使用“willSave”回调来更新 Foo 计数。

-(void)willSave
    if (self.isDeleted) 
        self.totalAssignments = [NSNumber numberWithFloat:([self.totalAssignments intValue] - 1)];
     else 
        self.totalAssignments = [NSNumber numberWithFloat:([self.totalAssignments intValue] + 1)];       
    

但是,上下文抱怨它很脏。我的问题是,在 NSManagedObject 中是否有一个回调可以用来在保存之前更新另一个 NSManagedObject 的属性?

【问题讨论】:

【参考方案1】:

处理此问题的最佳方法是在 Foo 类的 Bar 关系的访问器方法中。

如果关系是Foo.barsFoo 类将具有如下所示的访问器:

addBarsObject:
removeBarsObect:
addBarsObjects:
removeBarsObjects:

...看起来像:

- (void)addBarsObject:(NSManagedObject *)value     
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"bars" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"bars"] addObject:value];
    [self didChangeValueForKey:@"bars" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];

...你只需要像这样修改它:

- (void)addBarsObject:(NSManagedObject *)value     
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"bars" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"bars"] addObject:value];
    [self didChangeValueForKey:@"bars" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
    self.barCount = [NSNumber numberWithFloat:([self.barCount intValue] + 1)];
    //... or
    self.barCount=[self.bars count]; 

更改所有Foo.bars 访问器方法以随时跟踪关系的变化。这具有跟踪您可能实际需要的保存之间的计数的额外优势。

【讨论】:

【参考方案2】:

我认为您可以在致电NSManagedObjectContext(BOOL)save:(NSError **)error 之前执行此操作。您可以创建一个方法,在调用 save 之前更新与 NSManagedObject 的分配相关的所有调用和 totalAssigments

HTH,

阿克谢

【讨论】:

以上是关于Core Data NSManagedObject 关联计数缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data NSManagedObject 关联计数缓存?

Core Data,在后台线程中修改 NSManagedObject

如何在 Core Data 中制作 NSManagedObject 的深拷贝

在 Core Data 之外重用 NSManagedObject 的结构

如何使用更新的数据刷新 NSManagedObject - Core Data

在 Core Data 中获取和更新,或者创建和删除 NSManagedObject?