Я создаю функцию обмена сообщениями. Предполагая, что я определил объект сообщения в Core Data со свойствами «senderId», «receiverId» и «time».Как получить последнее сообщение на пару пользователей с помощью NSFetchRequest?
Я хочу создать NSFetchRequest, который возвращает последнее сообщение для каждой пары пользователей.
Идея заключается в использовании NSPredicate. Это то, что я в данный момент:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(receiverId = %@ && senderId = ?) || (senderId = %@ && receiverId = ?)", userId, userId];
[fetchRequest setPredicate:pred];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:NO];
fetchRequest.sortDescriptors = @[descriptor];
«идентификатор пользователя» является текущий пользователь, который может быть либо отправитель или получатель.
Текущее состояние не работает, потому что я не знаю, как «связать» первый случай (текущий пользователь отправитель), а второй случай (текущий пользователь - приемник) (помечен как «?») ? Другой пользователь не известен до запроса. Он должен быть одним и тем же пользователем.
Сортируя это, используя свойство «время», я бы получил последнее сообщение, но также и второе, и так далее. Я хочу получить последнее сообщение на пару пользователей.
Я также думал об использовании функции group by в запросе, но пока нет решения.
EDIT # 1:
На основании ответа Wilko X, я создал следующий код:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ENTITY"];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"senderId", @"receiverId", nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"senderId", @"receiverId", nil]];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:NO];
fetchRequest.sortDescriptors = @[descriptor];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
Что она делает это группируя объекты сообщений, которые имеют тот же SenderId и receiverId созвездие, но он не группирует все объекты сообщений на пару пользователей, имеющих как user1 (пользователь может быть либо отправителем, либо получателем на единицу сообщения), а user2 может принимать роль отправителя и получателя.