iPhone核心数据可以缓存NSManagedObject吗?
Posted
技术标签:
【中文标题】iPhone核心数据可以缓存NSManagedObject吗?【英文标题】:iPhone core data can I cache NSManagedObjects? 【发布时间】:2012-10-21 06:27:11 【问题描述】:我正在我的一个应用程序中运行数据模型,其中一个事件定义了“eventType”关系。这允许我通过更改它们的“eventType”关系对象来修改多个事件的外观。
我遇到的问题是,在插入事件之前,我使用下面的代码检查该对象的 typeRelationship 是否存在。如果我需要插入大量对象,这需要一些时间。
我可以缓存这个获取请求的结果(例如在NSMutableDictionary
中)并检查那个字典(本地内存),看看是否有一个NSManagedObject
带有给定的EventIDEnum
? 我可以让缓存永远保持活动状态,还是底层对象会在一段时间后“过时”?
-(Event*)insertAndReturnNewObjectWithTypeID:(EventIDEnum)eventTypeID date:(NSDate*)date
NSFetchRequest *eventTypesArray = [NSFetchRequest fetchRequestWithEntityName:@"EventType"];
eventTypesArray.predicate = [NSPredicate predicateWithFormat:@"SELF.id == %d", eventTypeID];
NSArray *eventTypes = [[DataManager sharedInstance].managedObjectContext executeFetchRequest:eventTypesArray error:nil];
if(eventTypes.count==0)
DLog(@"ERROR inserting event with type: %i NOT FOUND",(int)eventTypeID);
return nil;
else
if(eventTypes.count !=1)
DLog(@"ERROR found %i events with type %i",eventTypes.count,(int)eventTypeID);
EventType* eventType = [eventTypes lastObject];
if(date)
// DLog(@"Returning object");
return [self insertAndReturnNewObjectWithEventType:eventType date:date];
else
// DLog(@"Returning object");
return [self insertAndReturnNewObjectWithEventType:eventType];
感谢您查看我的问题!
【问题讨论】:
【参考方案1】:获取请求返回的对象数组无法缓存。它们仅在用于查询它们的 NSManagedObjectContext 尚未释放时才有效。 NsManagedObject.objectID 和您从查询中检索到的数据可以被缓存并保存多久,只要您愿意。您最好将相关数据和 objectID 复制到另一个您缓存并与 CoreData 对象分开维护的对象中;并释放获取请求返回的核心数据数组。
【讨论】:
【参考方案2】:您使用的模式通常称为“查找或创建”:查找其唯一特征匹配的对象,如果存在则返回,如果不存在则创建/填充/返回。
您可以做的一件事就是在 Core Data 之外做一些独特的事情。如果可能基于您的数据,也许您可以遍历您的 EventIDEnum 值,找到您需要可用的唯一值,从而减少您执行的提取次数。对于每个 EventIDEnum,您只需搜索一次。只要您在一个线程/上下文中工作,就可以缓存它们。
当我编写这种代码时,我发现将 NSManagedObjectContext 作为参数传递是很有帮助的。这使我可以在任何地方使用查找或创建或批量插入方法,无论是在主线程上还是在私有队列/上下文中。这将取代您的[[DataManager sharedInstance] managedObjecContext]
电话。
【讨论】:
以上是关于iPhone核心数据可以缓存NSManagedObject吗?的主要内容,如果未能解决你的问题,请参考以下文章