2013-03-25 64 views
0

我有一个具有属性的对象数组。我需要获得值为<=的对象。从基于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; 
} 

回答

3

添加的排序你的属性下降一种描述符,并限制结果的数量来一句:

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最大值返回一个对象即小于或等于给定值,或者如果找不到匹配的对象,则为空数组。