核心数据对象等级(慢)

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

然后执行您已经必须获取总数的提取

【讨论】:

以上是关于核心数据对象等级(慢)的主要内容,如果未能解决你的问题,请参考以下文章

等保2.0云计算定级对象如何确定

等级保护等级保护共分为几级?保护对象是指什么?

等级保护等级保护共分为几级?保护对象是指什么?

缺陷等级定义

mongodb通过profile来监控数据

Android五个进程等级(转)