0

我在我的一个应用程序中运行一个数据模型,其中一个事件定义了一个“eventType”关系。这允许我通过更改它们的“eventType”关系对象来修改多个事件的外观。

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

我可以缓存此获取请求的结果(例如 in 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];
        }



    }
}

谢谢你看我的问题!

4

2 回答 2

0

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

于 2012-10-24T15:58:02.360 回答
0

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

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

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

于 2013-03-27T18:36:18.867 回答