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吗?的主要内容,如果未能解决你的问题,请参考以下文章

多线程核心数据 - NSManagedObject 无效

将部分核心数据保存到云端

使用基于属性的过滤子元素集获取核心数据实体

核心数据最大存储 iPhone

iPhone核心数据递归关系

核心数据和图像缓存