gpt4 book ai didi

swift - NSFetchedResultsController 每个部分的不同排序描述符

转载 作者:可可西里 更新时间:2023-11-01 02:18:00 32 4
gpt4 key购买 nike

我有具有 NSDate 属性的对象,我需要将它们分成两部分(第一部分 - future 事件,第二部分 - 历史事件),然后对于第一部分,我需要按日期属性按升序对它们进行排序,第二部分部分按降序排列。知道如何进行排序吗?

最佳答案

假设您使用的是 NSFetchedResultsController,底层提取必须以一种或另一种方式排序。我可以想到两种不同的解决方案:

  1. 使用两个具有互补谓词的独立 FRC,以便一个处理过去的事件,而另一个处理 future 的事件。一个将按升序排序,另一个按降序排序。问题是两个 FRC 都会为第 0 节生成 indexPaths。因此,您需要重新映射第二个 FRC 的 indexPaths 以使用 tableView 的第 1 节。例如,在 cellForRowAtIndexPath 中,您需要这样的东西:

    if (indexPath.section == 0) {
    objectToDisplay = self.futureFetchedResultsController.objectAtIndexPath(indexPath)
    } else { // use second FRC
    let frcIndexPath = NSIndexPath(forRow: indexPath.row, inSection: 0)
    objectToDisplay = self.pastFetchedResultsController.objectAtIndexPath(frcIndexPath)
    }
  2. 或者,坚持使用单个 FRC,按升序排序。然后重新映射第二部分的 indexPath,以便该部分中的最后一个对象显示在第 0 行中,依此类推:

    if (indexPath.section == 0) {
    objectToDisplay = self.fetchedResultsController.objectAtIndexPath(indexPath)
    } else { // use remap to reverse sort order FRC
    let sectionInfo = self.fetchedResultsController.sections[1] as! NSFetchedResultsSectionInfo
    let sectionCount = sectionInfo.numberOfObjects
    let frcIndexPath = NSIndexPath(forRow: (sectionCount - 1 - indexPath.row), inSection:indexPath.section)
    objectToDisplay = self.fetchedResultsController.objectAtIndexPath(frcIndexPath)
    }

我个人认为第二种选择更可取。在每种情况下,所有 tableView 数据源/委托(delegate)方法都需要相同的重新映射,而 FRC 委托(delegate)方法需要反向映射。

关于swift - NSFetchedResultsController 每个部分的不同排序描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060023/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com