【问题标题】:iPhone core data can I cache NSManagedObjects?iPhone核心数据可以缓存NSManagedObject吗?
【发布时间】: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];
        }



    }
}

感谢您查看我的问题!

【问题讨论】:

    标签: iphone objective-c caching core-data nsmanagedobject


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您可以做的一件事就是在 Core Data 之外做一些独特的事情。如果可能基于您的数据,也许您可​​以遍历您的 EventIDEnum 值,找到您需要可用的唯一值,从而减少您执行的提取次数。对于每个 EventIDEnum,您只需搜索一次。只要您在一个线程/上下文中工作,就可以缓存它们。

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

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多