gpt4 book ai didi

ios - 核心数据对象等级(慢)

转载 作者:行者123 更新时间:2023-11-29 03:12:38 28 4
gpt4 key购买 nike

我需要获取一个对象在 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(即避免访问设备内存)?

谢谢。

最佳答案

您的计算存在一些问题:

  1. 您的“排名”不稳定。如果有 2 个对象具有相同的日期,则无法确定哪个对象先出现(在一次提取中第一个可能是第一个,而在另一个提取中可能是最后一个)...
  2. 如果您已经获取了对象,则执行计数请求没有意义(只需使用 [recordsArray count]
  3. 您获取整个实体而不是仅获取对象 ID(将获取请求结果类型设置为:NSManagedObjectIDResultType 并查找对象 ID

所以我的建议是:

  1. 在您的对象(计数器、creationDate 等...)之间创建一个“平局断开器”
  2. 使用这个谓词 [NSPredicate predicateWithFormat:@"date >= %@ AND tieBreaker > %@",self.date,self.tieBreaker]
  3. 获取该谓词的计数

这样你只需访问一次存储,而不必在一个巨大的数组中寻找对象......

关于ios - 核心数据对象等级(慢),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22064933/

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