我有一个简单的目录管理器功能,其中包含类别中的项目,除了一个项目可以在多个类别中。
项目具有“父母”键,即父类别的 NSSet
类别有“项目”键,它是其子项目的 NSOrderedSet
我正在使用NSFetchedResultController
它的代表来用物品填满我的桌子
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(ANY parents == %@)", self.category];
[fetchRequest setFetchBatchSize:30];
[fetchRequest setSortDescriptors:@[????????];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
所以使用这段代码我可以得到 self.category 中的项目列表
在我的 UI 中,我有Drag and Drop
功能。所以我可以在类别内移动项目。
我的问题: Category1 和 Category2 都包含对相同项目 Item1 和 Item2 的引用。我需要在 Category1 中有 Item1、Item2 的订单,在 Category2 中有 Item2、Item1 的订单。这就是为什么我将 category.items 属性设置为NSOrderedSet
.
但我只是不能按它们在 category.items 中的索引对项目进行排序
我尝试在排序描述符中使用块 - 没用,我尝试在排序描述符中使用选择器 - 没用,我尝试对排序描述符进行子类化 - 以某种方式工作,但在我更改它们的索引时不更新项目类别.项目。
在我的 NSSortDescriptorSubclass 中像这样:
- (NSComparisonResult)compareObject:(Item*)object1 toObject:(Item*)object2 {
int index1 = [self.category.items indexOfObject:object1];
int index2 = [self.category.items indexOfObject:object2];
if (index1 > index2) {
return NSOrderedDescending;
} else if (index1 < index2) {
return NSOrderedAscending;
}
return NSOrderedSame;
}
但是如果我在 Category.items 中更改订单,项目订单将不会在我的 UI 中更新
所以请帮我按照 category.items 集中的索引对项目进行排序。也许有一种方法可以通过一些键、运算符、表达式或其他任何东西来做到这一点。谢谢。