关于ios:如何将所有相关的自相关对象放在一个tableview中,并为每个关系映射关联section header?

How to put all related self-related objects in a tableview with associated section header for each relationship mapping?

我有一个名为"技能"的实体。 Skill 具有三种不同类型的关系映射 - 更容易、更难和相似。

enter

1
2
3
4
5
6
7
8
9
10
fileprivate lazy var relatedSkillsFetchedResultsController: NSFetchedResultsController<Skill> = {
        let appDelegate =
            UIApplication.shared.delegate as? AppDelegate
        let managedContext =
            appDelegate?.persistentContainer.viewContext
        let request: NSFetchRequest<Skill> = NSFetchRequest(entityName:"Skill")
        request.predicate = NSPredicate(format:"%@ IN self.easier OR %@ IN self.harder OR %@ IN self.similar", skill!,skill!,skill!)
        let skillFetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: managedContext!, sectionNameKeyPath: #keyPath(skill.relationshipFetchName), cacheName: nil)
        return skillFetchedResultsController
    }()

我在想 - 因为更容易是更难的倒数,更难的倒数是更容易的倒数,相似是相似的倒数......我可以单独获取原始文件...然后使用谓词获取所有技能主要技能是那些更难或更容易或相似的技能。

这听起来像是正确的做法吗?

我也不知道如何设置sectionNameKeyPath。它基本上对应于它匹配的三个 NSPredicate OR 中的哪一个?


配置 FRC 的困难不在于找到 sectionNameKeyPath,尽管这可能很困难,而在于获得与所需部分一致的排序描述符:与获取请求兼容的排序描述符相对有限。

在您的情况下,我很想只创建一个从 Skill 到自身 (relatedSkills) 的单一自反关系,而是向 Skill 实体添加一个整数属性,以表示 difficulty。您可以决定等级(例如 0-9、0-99 等等)并决定难度必须接近多近(例如 /-1 或 /-2 等)才能判断两种技能"相似" "。

然后您可以使用谓词仅选择与您选择的技能相关的技能:

1
NSPredicate(format:"ANY relatedSkills == %@", chosenSkill)

并添加一个基于 difficulty 的排序描述符。然后定义一个函数来确定(使用您决定的规则)任何给定的技能是"更容易"、"相似"还是"更难"。该功能将是您的 sectionNameKeyPath.

更新

嗯,经过一夜的思考,我意识到我错了。在上述场景中,sectionNameKeyPath 是难点:问题是它取决于当前选择的技能,但函数可以不带参数,因此无法"知道"当前选择的技能是哪个。回到绘图板....