gpt4 book ai didi

objective-c - 向 Core Data 添加唯一对象

转载 作者:太空狗 更新时间:2023-10-30 03:26:12 26 4
gpt4 key购买 nike

我正在开发一个 iPhone 应用程序,它从数据库中获取大量对象。我想使用 Core Data 存储这些,但我的关系有问题。

详细信息包含任意数量的 POI(兴趣点)。当我从服务器获取一组 POI 时,它们包含一个详细 ID。为了将POI和Detail关联起来(通过ID),我的流程是这样的:在 ManagedObjectContext 中查询 detailID。如果该详细信息存在,请将 poi 添加到其中。如果没有,则创建详细信息(它具有将被延迟填充的其他属性)。

问题在于性能。由于涉及多个关系,对 Core Data 执行持续查询很慢,添加 150 个 POI 的列表需要一分钟。

在我的旧模型中,在 Core Data(各种 NSDictionary 缓存对象)出现之前,这个过程非常快(在字典中查找一个键,如果不存在则创建它)

我的关系不止这一个,但几乎每个人都必须做这个检查(有些是多对多的,他们有一个真正的问题)。

有人对我如何提供帮助有任何建议吗?我可以执行更少的查询(通过搜索大量不同的 ID),但我不确定这会有多大帮助。

部分代码:

        POI *poi = [NSEntityDescription
insertNewObjectForEntityForName:@"POI"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];

poi.POIid = [attributeDict objectForKey:kAttributeID];
poi.detailId = [attributeDict objectForKey:kAttributeDetailID];
Detail *detail = [self findDetailForID:poi.POIid];
if(detail == nil)
{
detail = [NSEntityDescription
insertNewObjectForEntityForName:@"Detail"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
detail.title = poi.POIid;
detail.subtitle = @"";
detail.detailType = [attributeDict objectForKey:kAttributeType];
}





-(Detail*)findDetailForID:(NSString*)detailID {
NSManagedObjectContext *moc = [[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Detail" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];

NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"detailid == %@", detailID];
[request setPredicate:predicate];
NSLog(@"%@", [predicate description]);

NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil || [array count] != 1)
{
// Deal with error...
return nil;
}
return [array objectAtIndex:0];
}

最佳答案

请查看 Xcode 的核心数据编程指南中标题为“核心数据性能”的页面上标题为“批量错误”的部分,诺曼在他的回答中链接了该部分。

只获取那些 id 为 IN id 集合(NSSetNSArrayNSDictionary)的 managedObjects服务器返回的对象的效率可能更高。

NSSet *oids = [[NSSet alloc] initWithObjects:@"oid1", @"oid2", ..., nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"oid IN %@", oids];
[oids release];

更新:我将此技巧用于 acani usersView 的解决方案中.基本上,下载一个JSON response of users之后, iPhone 使用 popular open source JSON framework将响应解析为 NSDictionary 对象的 NSArray,每个对象代表一个用户。然后,它生成它们的 uid 的 NSArray 并在 Core Data 上批量获取以查看它们中是否已经存在于 iPhone 上。如果没有,它会插入它。如果是这样,仅当它们的 updated 属性早于服务器中的属性时,它才会更新确实存在的那些。

关于objective-c - 向 Core Data 添加唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com