ios - 核心数据 : Sort items by index in category's set

标签 ios sorting core-data

我有一个简单的目录管理器功能,其中包含类别中的项目,除了一个项目可以在多个类别中。

Item 有 'parents' 键,它是父类别的 NSSet

Category 有 'items' 键,它是它的子项的 NSOrderedSet

我正在使用 NSFetchedResultController 及其委托(delegate)来用项目填充我的表

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 中的项目列表

在我的用户界面中,我具有拖放 功能。所以我可以在类别内移动项目。

我的问题:Category1 和 Category2 都包含对相同项目 Item1 和 Item2 的引用。我需要在 Category1 中订购 Item1、Item2,在 Category2 中订购 Item2、Item1。这就是为什么我将 category.items 属性设置为 NSOrderedSet

但我无法按 category.items 中的索引对项目进行排序

我尝试在排序描述符中使用 block - 没有用,我尝试在排序描述符中使用选择器 - 没有用,我尝试对排序描述符进行子类化 - 以某种方式工作但在我更改时不更新项目他们的索引是 category.items.
在我的 NSSortDescriptorSubclass 中像这样:

- (NSComparisonResult)compareObject:(Item*)object1 toObject:(Item*)object2 {

int index1 = [self.category.items indexOfObject:object1];
int index2 = [self.category.items indexOfObject:object2];

如果(索引 1 > 索引 2){
    返回 NSOrderedDescending;
} 否则如果(索引 1 < 索引 2){
    返回 NSOrderedAscending;
}

返回 NSOrderedSame;

} 但是,如果我更改 Category.items 中的顺序,我的 UI 中的项目顺序将不会更新

所以,请帮我按 category.items 集中的索引对项目进行排序。也许有一种方法可以通过一些键、运算符、表达式或其他任何东西来做到这一点。谢谢。

最佳答案

我建议您不要使用有序的对多关系。看起来它们并没有真正按预期工作并且不符合您的需求。

相反,您需要引入自己的属性来进行排序。您可以有一个实体 categoryItem,它与 CategoryItem 以及属性 sequence 都有一对一的关系>。

在您的 FRC 中,您获取 categoryItem 实体,并且在显示时您只需使用 categoryItem.item 来访问项目的属性。当您重新排序(例如通过拖放)时,您必须重新编号所有 categoryItem 并分配正确的序列号。

-- 编辑--

要在项目的某些细节发生变化时将 categoryItem 标记为“脏”:您可以在 categoryItem 中实现一个方法 markDirty 看起来像这样:

// CategoryItem.m
-(void)markDirty {
    [self willChangeValueForKey:@"sequence"];
    [self didChangeValueForKey:@"sequence"];
}

// EditItemController.m
item.attribute = newAttribute; 
for (CategoryItem *i in item.categoryItems) { [i markDirty]; }

关于ios - 核心数据 : Sort items by index in category's set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768491/

相关文章:

ios - 延迟类选择器调用

ios - 在惰性 map 集合中按日期快速排序

java - 是否有与 Apple 的 Core Data 等效的 Java?

php - 对 mysql 查询的结果进行排序

arrays - 在 Shell 脚本中组织一系列数据

objective-c - 在 Core Data 中保存 MKOverlay 对象

ios - Xcode 实体核心数据 - NSDate 错误年份?

ios - 将模型从 UINavigationView 转发到 UIView

ios - SourceKitService 终止

ios - colorWithPatternImage 在 io6 中不起作用?