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.bars
,Foo
类将具有如下所示的访问器:
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 的结构