Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData:按类别'中的索引对项目进行排序;s集_Ios_Sorting_Core Data - Fatal编程技术网

Ios CoreData:按类别'中的索引对项目进行排序;s集

Ios CoreData:按类别'中的索引对项目进行排序;s集,ios,sorting,core-data,Ios,Sorting,Core Data,我有一个简单的目录管理器功能,可以将项目分类,但一个项目可以分为多个类别 项具有“parents”键,该键是父类别的集合 类别具有“items”键,该键是其子项的集合 我正在使用NSFetchedResultController及其委托用项目填充我的表 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForN

我有一个简单的目录管理器功能,可以将项目分类,但一个项目可以分为多个类别

具有“parents”键,该键是父类别的集合

类别具有“items”键,该键是其子项的集合

我正在使用
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中,我有
拖放功能。所以我可以在类别内移动项目

我的问题:类别1和类别2都包含对相同项目1和项目2的引用。我需要在类别1中有Item1,Item2顺序,在类别2中有Item2,Item1顺序。这就是为什么我将category.items属性设置为
sensorderedset

但我就是不能按category.Items中的索引对项目进行排序

我尝试在排序描述符中使用块-不起作用,我尝试在排序描述符中使用选择器-不起作用,我尝试将排序描述符子类化-在某种程度上起作用,但在我更改其索引it类别时不会更新项。项。
就像我的nsSortDescriptor子类中的这样:


-(NSComparisonResult)将对象:(项*)对象1与对象:(项*)对象2进行比较{

int index1=[self.category.items indexOfObject:object1];
int index2=[self.category.items indexOfObject:object2];
如果(index1>index2){
退而求其次;
}否则如果(index1
}
但如果我在Category.items中更改订单,则不会在我的UI中更新项目订单


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

核心数据中的一对多关系是
NSSet
s,而不是
NSOrderedSet
s。因此,不会保存类别中某个项目的索引。您可以向核心数据模型添加另一个名为的实体,类似于
IndexValue
IndexValue
将有两个属性,
categoryId
categoryName
(以有意义的为准),然后是
categoryIndex
<代码>项
将与该实体具有一对多关系(以及一对一的反向关系,因为不需要重用这些实体,它们应该是唯一的)。对于
项目
所在的每个
类别
,将创建一个
索引值


编辑:似乎添加了一个ordered属性以支持中的一对多关系。这必须是你的目标和使用。关于此功能的文档很少,但是在获取关系时,应该在不需要使用
NSSortDescriptor
s的情况下保持顺序。至于更改顺序,我不确定这是如何得到支持的。与我概述的上述方法相比,使用此方法也更有效。

我建议您不要使用多对多关系。似乎它们并没有真正按照预期工作,也不符合您的需要

相反,您需要引入自己的属性来进行排序。您可以拥有一个实体
categoryItem
,该实体与
类别和
项目以及属性
序列都有一个关系

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

--编辑--

要在项目的某些细节发生更改时将
categoryItem
标记为“dirty”:可以在
categoryItem
中实现如下方法:

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

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

你坚持使用NSFetchedResultsController?因为你已经有了自我分类。以索引顺序访问该有序集中的项很简单,就像在数据源方法中调用-objectAtIndex:一样。是的,我想使用它,因为我希望在更改appAlright其他部分的某些属性时自动更新我的项。带有比较器块的排序描述符肯定适用于一次性排序。困难的部分是让NSFetchedResultsController知道关系顺序的变化。我不知道有什么方法可以做到这一点。不幸的是,您不能在CoreData中使用块作为排序描述符。它只会产生一个错误,这并不完全正确。有序关系可从iOS5获得。通过在数据模型的关系属性中设置ordered flag,可以将普通关系(基于NSSet)转换为有序关系(基于NSOrderedSet)。是的,这是真的,他们添加了这个有序复选框,所以我想使用它,这可能行得通!非常感谢你!让我试着实现这一点,并将您的答案标记为正确。感谢您是否知道解决方案产生的问题的解决方法:现在,如果我更改某个项中的某些参数,则我的表视图不会更新(仅当categoryItem参数更改时才会更新)。是的,这是一个微妙的问题。您可以在我编辑的答案中尝试解决方法。您是否尝试了一个简单的
[tableView reloadData]
或者也可能
[self.frc performFetch:self.frc.fetchRequest error:nil]?顺便说一句,我决定实现您的
markDirty
解决方案,因为它只更新我的表视图中的一行而不是全部,而且只要我有来自URL的图像,就最好只更新一条记录。再次感谢!
// CategoryItem.m
-(void)markDirty {
    [self willChangeValueForKey:@"sequence"];
    [self didChangeValueForKey:@"sequence"];
}

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