0

我相信我的问题相当简单,但我似乎无法找到一个体面而优雅的解决方案。也许 Core Data 没有一个优雅的解决方案,或者我的谷歌技能让我失望了,在这种情况下,我很抱歉。

假设我有一个简单的消息传递应用程序。我有两个核心数据实体:ThreadMessage. AThread包含许多Messages.

我的应用程序应该打开一个 UITableView,其中Threads列出了所有内容。应用程序将使用 RestKit 及其对象映射机制来加载数据。Messages有财产created。_

所以我想对我的线程列表进行排序,以便具有最新消息的线程出现在顶部,其中包含最旧消息的线程将出现在底部。

我相信这也是 Apple 自己的消息应用程序中发生的情况,它也使用了 Core Data。这是我希望有一个更优雅的解决方案的主要原因,而不是例如存储与数据库中最新消息的额外关系。在我的情况下这是不切实际的,因为我使用 RestKit 对象映射并且对 HTTP API 没有影响。

我尝试过瞬态值,这不起作用,因为您无法对它们进行排序。我尝试了一个带有 NSComparisonResult 块的排序描述符,但这也不起作用,因为核心数据说它不能对多对关系进行排序。而且我查看了获取的属性,但我无法弄清楚要使用什么谓词。

提前致谢。

4

2 回答 2

2

您可以为您的类创建一个只读lastMessageDate属性。Thread实现您自己的 getter 以从线程消息中返回最新日期。然后使用此属性对线程进行排序:

NSArray *sortedThreads = [threads sortedArrayUsingComparator: ^(Thread *thread1, Thread *thread2) {
    return [thread2.lastMessageDate compare:thread1.lastMessageDate];
}];
于 2012-09-14T11:48:18.323 回答
0

您在获取核心数据对象时是否尝试过 NSSortDescriptor,例如:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:YOUR_ENTITY inManagedObjectContext:[AppDelegate objectModel]];

[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdOn" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];



NSError *error;
NSMutableArray *mutableFetchResults = [[[AppDelegate objectModel] executeFetchRequest:fetchRequest error:&error] mutableCopy];

if (!mutableFetchResults) {
    // Handle the error.
    NSLog(@"Fetching data failed: %@", error);
}

return mutableFetchResults;
于 2012-09-14T12:21:33.430 回答