Core Data - Извлекать последние объекты из массива объектов?

Используя приведенный ниже код, я получаю массив электронных писем из Core Data. Я передаю массив emailId в качестве предиката для выборки, и он возвращает все электронные письма для каждого из emailId.

Однако мне нужен только последний объект (или последнее электронное письмо) каждого из идентификаторов электронной почты в предикате. В настоящее время я беру результат этой выборки и использую отдельную сортировку для фильтрации нужных мне объектов. Тем не менее, я бы хотел, чтобы фильтрация была в самой выборке. Есть ли способ сделать это?

- (NSFetchedResultsController *)getLatestEmail:(NSArray *)emailId
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"email_id IN %@", emailId];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Emails"
                                              inManagedObjectContext:self.context];
    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:predicate];
    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"last_update_timestamp" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
                                                             initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.context
                                                             sectionNameKeyPath:nil
                                                             cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.emailFetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.emailFetchedResultsController performFetch:&error])
    {
        NSLog(@"getLatestEmail failed %@, %@", error, [error userInfo]);
    }

        NSArray *emails = [[self.context executeFetchRequest:fetchRequest error:&error] mutableCopy];


    return _emailFetchedResultsController;
}

Я пытался добавить .lastobject к [[self.context executeFetchRequest:fetchRequest error:&error] mutableCopy], но не получилось. Я также не смог найти никакой документации, которая предполагает, что это возможно. Тем не менее, я уверен, что кто-то попробовал это раньше и хотел бы услышать их мнение.


person user2734323    schedule 24.02.2014    source источник
comment
Я не думаю, что вы можете сделать с основными данными. вам лучше взять возвращенный набор и использовать предикат @max. посмотрите на developer.apple.com/library/ ios/documentation/Cocoa/Conceptual/   -  person Will Johnston    schedule 24.02.2014
comment
Я могу быть далеко здесь, но если вы можете получить первую запись, скажем, электронные письма [0], не будет ли последней записью электронные письма [-1]. Кажется, это работает на нескольких языках программирования.   -  person StephenCollins    schedule 25.02.2014


Ответы (1)


Инвертируйте свой дескриптор сортировки, затем просто установите размер пакета равным 1, а смещение равным нулю.

person timurbeg    schedule 24.02.2014