dynamic创buildNSFetchedResultsController的部分

我正在使用NSFetchedResultsController(NSFRC)在UITableView显示信息。 我正在尝试为用户创build选项,以按字母顺序排列单元格。 问题是,这些部分将被确定使用下载的信息。 在此之上,每个项目的部分将会相对经常变化,所以我不想保存该部分。 我注意到在我对类似问题的研究中提到了瞬态属性,但是我从来没有用过这些,我不确定是否可以使用它们,因为一旦数据已经加载完成所有的计算,我也希望这个解决scheme与我以前的Core Data database兼容。 另外我在Core Data也不是特别好,(也不是Objective-C !),所以我不完全确定如何去做这件事。

所以,如果我们使用瞬态属性,这就是我想要的(下一步是理论性的,因为我不知道瞬态属性是否是正确的方向)。 我想要4个可能的部分,0-3(我将使用TableView delegate重命名它们来解决sorting问题)。 计算完成后,每个单元格将被分配到transient属性(如果需要,默认部分为2)。 我希望这一切都有道理。

对,现在有一些理论的代码。 首先,我在数据模型屏幕上创build瞬态属性,并通过检查瞬态checkbox来使其瞬变。听起来很简单。

willDisplayCell的计算代码(由于几个原因需要在willDisplayCell中完成),实体可以像这样保存:

 MyEntity *myEntity = [self.fetchedResultsController objectAtIndexPath:indexPath]; myEntity.sectionTransientProperty = 2; if (![self.managedObjectContext save:&error]) { NSLog(@"Error: %@", error); FATAL_CORE_DATA_ERROR(error); return; } 

完成吧? 那是我们如何赋值给一个瞬态属性?

然后我更改NSFRC中的sorting选项,当我分配它:

 fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"sectionTransientProperty" cacheName:@"MyEntity"]; 

我们怎么做,还有什么我需要做的? 还是我有这么可怕的错误,我应该放弃Core Data and NSFRC? 如果你们可以帮我引导我,我真的很感激。 如果你需要我发布更多的代码,我会很高兴。

问候,
麦克风

如果你想要一个FRC的部分,你必须添加一个sorting描述符到获取请求,该sorting描述符不能基于瞬态属性。

请参阅initWithFetchRequest的文档:managedObjectContext:sectionNameKeyPath:cacheName:`:

如果控制器生成段,则使用数组中的第一个sorting描述符将对象分组为段; 其键必须与sectionNameKeyPath相同,或者使用键的相对顺序必须与使用sectionNameKeyPath的顺序相匹配。

和“核心数据编程指南”中的读取谓词和sorting描述符 :

另一方面,SQL存储将谓词和sorting描述符编译为SQL,并在数据库本身中评估结果。 这主要是为了性能,但这意味着评估发生在非Cocoa环境中,所以依赖于Cocoa的sorting描述符(或谓词)无法工作。 支持的sortingselect器是…
另外,您不能使用SQLite存储对瞬态属性进行sorting。

这意味着您不能纯粹在瞬态属性上创build节。 您需要一个持久性属性来创build节的sorting。

更新:作为sectionNameKeyPath的一个临时属性的典型用法是:你的对象有一个“timeStamp”属性,并且你希望将这些对象分成每个月有一节的节(请参阅iOS开发者库中的DateSectionTitles示例代码)。 在这种情况下,你有

  • 持久属性“timeStamp”,
  • 使用“timeStamp”作为获取请求的第一个sorting描述符,
  • 用作sectionNameKeyPath的瞬态属性“sectionIdentifier”。 “sectionIdentifier”是从“timeStamp”中计算出来的,并返回一个表示时间戳的年份和月份的string,例如“2013-01”。

FRC所做的第一件事是根据“timeStamp”属性所有提取的对象进行sorting 。 然后根据“sectionIdentifier”属性将对象分组为多个部分。

因此,对于FRC将对象分组为部分,您确实需要一个持久属性。 最简单的解决scheme是将一个持久属性“sectionNumber”添加到您的实体,并将其用于“sectionNameKeyPath” 第一个sorting描述符。