0

プロパティを持つオブジェクトの配列があります。値のオブジェクトを取得する必要があり<=ます。

[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;
}
4

1 に答える 1

3

属性の降順で並べ替える並べ替え記述子を追加し、結果の数を1つに制限します。

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指定された値以下の1つのオブジェクトを返すか、一致するオブジェクトが見つからなかった場合は空の配列を返します。

于 2013-03-25T18:02:12.677 に答える