我的模型包含Tag
和Document
s。每个标签可以有多个文档。每个文档可以有多个标签。在标签中,所有文件都是订购的。 Tag.Documents关系当前是NSSet,因此它是无序的。
我还使用NSFetchedResultsController
和NSSortDescriptor
,只返回其他创建时属性中的文档。但我需要它们的顺序不同,具体取决于我目前正在显示的标签。
在查看了多个其他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 ...
答案 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”属性的更改不会自动触发表视图更新,因为获取的结果控制器会 不跟踪相关对象的更改。