从基于max属性的数组获取对象
问题描述:
我有一个具有属性的对象数组。我需要获得值为<=
的对象。从基于max属性的数组获取对象
我的[timeLog time]
是在几秒钟内,所以我需要将它转换为分钟,然后将其与Object.conversion_factor
进行比较。我最终想要的最大conversion_factor
即<=
分钟[timeLog time]
这是最好的方法是有没有更好的方法(在单个谓词中做这一切)?
+ (NSNumber *)getTimeUnitForTimeLogEntry:(TimeLog *)timeLog
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"TimeUnit"
inManagedObjectContext:[[CoreDataHelper sharedInstance] managedObjectContext]];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"conversion_factor <= %i", [OnTimeClasses getMinutesFromTime:[timeLog time]]];
[request setPredicate:predicate];
NSError *error;
NSNumber *returnValue;
NSArray *array = [[[CoreDataHelper sharedInstance] managedObjectContext] executeFetchRequest:request error:&error];
NSLog(@"Array: %@", array);
if (array != nil) {
NSInteger unit = [[array valueForKeyPath:@"@max.conversion_factor"] integerValue];
NSPredicate *finalPredicate = [NSPredicate predicateWithFormat:@"conversion_factor == %i", unit];
[request setPredicate:finalPredicate];
NSArray *array = [[[CoreDataHelper sharedInstance] managedObjectContext] executeFetchRequest:request error:&error];
NSLog(@"New array: %@", array);
TimeUnit *timeUnit = [array objectAtIndex:0];
returnValue = [timeUnit id];
}
else {
NSString *message = @"Unable to find a good time unit for entry.";
NSAlert *alert = [NSAlert alertWithMessageText:@"Error" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", message];
[alert runModal];
}
return returnValue;
}
+ (NSInteger)getMinutesFromTime:(NSString *)time
{
double minutesFloat = [time doubleValue]/60;
NSInteger minutes = round(minutesFloat);
return minutes;
}
答
添加的排序你的属性下降一种描述符,并限制结果的数量来一句:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"conversion_factor <= %i", [OnTimeClasses getMinutesFromTime:[timeLog time]]];
[request setPredicate:predicate];
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"conversion_factor" ascending:NO];
[request setSortDescriptors:@[sortDesc]];
[request setFetchLimit:1];
获取请求然后用conversion_factor
最大值返回一个对象即小于或等于给定值,或者如果找不到匹配的对象,则为空数组。