核心数据排序关系+ NSFetchedResultsController

时间:2014-02-03 09:40:10

标签: ios core-data

我的模型包含TagDocument s。每个标签可以有多个文档。每个文档可以有多个标签。在标签中,所有文件都是订购的。 Tag.Documents关系当前是NSSet,因此它是无序的。

我还使用NSFetchedResultsControllerNSSortDescriptor,只返回其他创建时属性中的文档。但我需要它们的顺序不同,具体取决于我目前正在显示的标签。

在查看了多个其他SO问题后,似乎使用NSOrderedSet可能无法提供解决方案,因此我尝试添加指向1 Tag和1 Document的第三个对象TagDocumentPair。每个标记和文档都将指向多个TagDocumentPair对象。很直接。

我的问题是我应该如何创建NSSortDescriptor?

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:.managedObjectContext];
request.predicate = [NSPredicate predicateWithFormat:@"tags contains %@",tag];
request.fetchBatchSize = 20;
request.sortDescriptors =
//  @[[NSSortDescriptor sortDescriptorWithKey:@"creationTime" ascending:NO]];

这可能很容易用JOIN ...

1 个答案:

答案 0 :(得分:2)

你认为获取请求不能按照有序关系对结果进行排序是正确的,因此使用“中间”实体可能是唯一的解决方案。

然后,您将在“TagDocumentPair”实体而不是“Document”实体上执行获取请求:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"TagDocumentPair" inManagedObjectContext:managedObjectContext];
request.predicate = [NSPredicate predicateWithFormat:@"tag == %@", selectedTag];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"orderNumber" ascending:NO]];

其中“orderNumber”是描述排序的“TagDocumentPair”的属性 标签的文件。

由于每个“TagDocumentPair”都指向一个“文档”,因此您可以显示 cellForRowAtIndexPath等中的文档属性

此解决方案的一个缺点可能是对“Document”属性的更改不会自动触发表视图更新,因为获取的结果控制器会 不跟踪相关对象的更改。