如何将所有相关的自相关对象放在一个表视图中,并为每个关系映射提供相关的节头?

问题描述 投票:0回答:1

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

enter image description here

我想使用 3 个部分创建一个表视图--对于我碰巧正在查看的特定技能,分别是更容易、更难和类似。我试图确定如何使用NSFetchedResultsController创建一个获取请求,将所有这3个技能收集为一个。以下是我的尝试

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中的哪一个吧?

ios core-data nspredicate nsfetchedresultscontroller
1个回答
1
投票

配置一个FRC的难点并不在于找到了 sectionNameKeyPath,尽管这可能很困难,但更重要的是得到一个与所需部分一致的排序描述符:与取回请求兼容的排序描述符是相对有限的。

在你的案例中,我会倾向于只创建一个单一的、从Skill到其自身的反身关系 (relatedSkills),但要在Skill实体中添加一个整数属性,以代表 difficulty. 你可以决定尺度(例如:0-9,0-99,什么都可以),并决定两个技能的难度必须接近多少(例如:+-1,或+-2,等等)才能判断为 "相似"。

然后,你可以使用一个谓词来选择与你选择的技能相关的技能。

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

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

更新

好吧,思考了一夜,我意识到我错了。 在上述情况下, sectionNameKeyPath 困难的是:问题是它取决于当前选择的技能,但该函数不能接受任何参数,所以不能 "知道 "哪个是当前选择的技能。 回到画板上....

© www.soinside.com 2019 - 2024. All rights reserved.