使用谓词对表视图中的单个实体分组NSFetchedResults

时间:2013-07-22 20:39:30

标签: ios nspredicate nsfetchedresultscontroller

我有一个表格向我显示了我能够“ping”的用户。看起来应该是这样的:

Best Friends (section name in tableview)
 - User A - ping button
 - User D - ping button
Friends (section name in tableview)
 - User B - ping button
 - User C - ping button
 - User F - ping button
Pinged friends (section name in tableview)
 - User E
 - User G

该表基本上显示了我的所有用户(相同的coredata实体),但是以分组的方式显示。我正在使用(或者至少我认为我应该)nsfetchedresultscontroller,因为当您单击第一部分中的Ping按钮时应该发生动态。我想要的行为是:

  1. 用户点击第一部分“用户A”行中的“ping按钮”
  2. ping按钮消失,当我收到服务器响应时,它会动画到“Pinged friends”部分。最好在下面的部分添加动画,但也可以在最后一部分的第一部分淡入淡出。
  3. 第1部分显示尚未ping通的“最好的朋友”列表。该订单是根据您敲定某人及其姓名的次数(我已经有一个计数器)。这显示了最后的X个用户。

    in pseudo SQL : WHERE pinged = false AND numberOfPing >= 10 ORDER BY name ASC LIMIT 5
    

    第二部分显示所有不在第一部分或最后部分的所有按字母顺序排列的朋友。

    in pseudo SQL : AND numberOfPing < 10 AND pinged = false ORDER BY name ASC
    

    第3部分显示了所有已经被ping过的朋友。

    in pseudo SQL : WHERE pinged = true ORDER BY name ASC
    

    问题:

    NSFetchedResultsController是否是正确的方法?到目前为止,我在其他桌面视图中取得了成功,我喜欢它可以产生的“自动”动画。

    我应该只使用一个fetchRequest,对吧?但是我找不到任何合适的例子来接近我正在寻找的行为。根据这三个标准进行分组。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

应该让这很容易的一个方面是每个User实例应该通过内省知道它属于哪个类别。

您可以在User NSManagedObject子类(提示:使用类别)中实现一个返回节类别的方法(它可以是数字,因此您可以按它排序)。您可以将此计算类别用作获取结果控制器的sectionNameKeyPath

有关如何在托管对象中实现此功能,请参阅Apple的DateSectionTitles示例代码。它们使用瞬态属性,这是执行此操作的最有效方法。

答案 1 :(得分:1)

FRC不会生成动画,它所做的“全部”(在我们讨论的内容中)是观察变更的托管对象上下文并告诉您(作为代理)发生了什么。它是委托方法实现,它告诉表视图要执行的动画。因此,FRC不需要实现您想要的动画。

正如您所说,使用FRC很难实现您想要排序的方式以及您将拥有的部分。触发动画的用户操作是通过控制器无论如何处理的按钮。因此,在这种情况下最好不要使用FRC。

您可以为表格的每个部分使用不同的FRC。如果您希望任何部分有很多行(这样您就可以利用FRC分页),这只会非常有用。