核心数据对象等级(慢)
Posted
技术标签:
【中文标题】核心数据对象等级(慢)【英文标题】:Core Data object rank (slow) 【发布时间】:2014-02-27 09:57:26 【问题描述】:我需要获取一个对象在 Core Data 中数千个其他对象之间的排名。现在,这是我的代码:
- (void)rankMethod
//Fetch all objects
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Records"];
[fetchRequest setIncludesPropertyValues:NO];
//Sort all objects by date / recent date == better rank
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
//Set all objects in a NSArray
NSError *error;
NSArray *recordsArray = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
//Get the rank of my object (self.record) in the array
NSUInteger recordRank = [recordsArray indexOfObject:self.record] + 1;
//Get the count of all objects
NSUInteger recordsCount = [managedObjectContext countForFetchRequest:fetchRequest error:&error];
//NSLog my object rank
NSLog(@"Rank: #%ld/%ld", (unsigned long)recordRank, (unsigned long)recordsCount);
//Console display: "Rank: #4282/5000"
这段代码的问题在于,在大型 NSArray(数千个对象)上获取对象的索引可能非常慢(可能需要几秒钟)。有没有办法直接在 Core Data 中捕获对象的等级而无需使用 NSArray(即避免访问设备内存)?
谢谢。
【问题讨论】:
你需要什么 rank 属性?获取最后插入的对象? 【参考方案1】:您的计算存在一些问题:
-
您的“等级”不稳定。如果有 2 个对象具有相同的日期,则无法确定 whitch 是第
如果您已经获取了对象,则执行计数请求没有意义(只需使用
[recordsArray count]
您获取整个实体而不是仅获取对象 ID(将获取请求结果类型设置为:NSManagedObjectIDResultType
并查找对象 ID
所以我的建议是:
-
在您的对象(计数器、creationDate 等...)之间创建一个“决胜局”
使用这个谓词
[NSPredicate predicateWithFormat:@"date >= %@ AND tieBreaker > %@",self.date,self.tieBreaker]
获取此谓词的计数
这样你只需要访问一次存储,而不必在一个巨大的数组中寻找对象...
【讨论】:
【参考方案2】:如果您使用 NSPredicate 执行 Fetch,请求所有大于 self.record.date
的条目,那么记录的排名是返回的条目数加 1
然后执行您已经必须获取总数的提取
【讨论】:
以上是关于核心数据对象等级(慢)的主要内容,如果未能解决你的问题,请参考以下文章