2012-10-21 171 views
0

我在其中一个应用程序中运行数据模型,其中事件定义了“eventType”关系。这使我可以通过更改其“eventType”关系对象来修改多个事件的外观。iPhone核心数据可以缓存NSManagedObjects?

我遇到的问题是,在插入事件之前,我检查下面的代码是否存在此对象的typeRelationship。这需要一些时间,如果我需要插入大量的对象。

我可以缓存,读取请求(例如在NSMutableDictionary)的结果,检查词典(本地内存),看看是否有给定EventIDEnumNSManagedObject我可以让缓存永久保存吗?或者底层对象会在一段时间后变得“过时”吗?

-(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]; 
     } 



    } 
} 

谢谢你看看我的问题!

回答

0

无法缓存由获取请求返回的对象数组。只有用于查询它们的NSManagedObjectContext没有被释放时,它们才是有效的。 NsManagedObject.objectID和从查询中检索到的数据可以被缓存并保存,只要你喜欢。您最好将相关数据和对象ID复制到与CoreData对象分开缓存和维护的另一个对象中;并释放由获取请求返回的核心数据数组。

0

您正在使用的模式通常被称为“查找或创建”:查找其分配特征匹配的对象,如果它存在则返回它,如果它不存在则创建/填充/返回它。

你可以做的一件事是加速核心数据以外的独立操作。如果根据您的数据有可能,也许您可​​以遍历EventIDEnum值,找到需要的唯一值,从而减少执行的提取次数。您只会为每个EventIDEnum搜索一次。只要你在一个线程/上下文中工作,你可以缓存这些。

当我写这种代码时,我发现传入NSManagedObjectContext作为参数很有帮助。这使我可以在主线程或专用队列/上下文中的任何位置使用查找或创建或批量插入方法。这将取代你的[[DataManager sharedInstance] managedObjecContext]电话。