我有一个名为 "Skill "的实体。Skill与自身有三种不同类型的关系映射--更容易、更难和类似。
我想使用 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中的哪一个吧?
配置一个FRC的难点并不在于找到了 sectionNameKeyPath
,尽管这可能很困难,但更重要的是得到一个与所需部分一致的排序描述符:与取回请求兼容的排序描述符是相对有限的。
在你的案例中,我会倾向于只创建一个单一的、从Skill到其自身的反身关系 (relatedSkills
),但要在Skill实体中添加一个整数属性,以代表 difficulty
. 你可以决定尺度(例如:0-9,0-99,什么都可以),并决定两个技能的难度必须接近多少(例如:+-1,或+-2,等等)才能判断为 "相似"。
然后,你可以使用一个谓词来选择与你选择的技能相关的技能。
NSPredicate(format:"ANY relatedSkills == %@", chosenSkill)
并在此基础上添加一个排序描述符 difficulty
. 然后定义一个函数来确定(使用您决定的规则)任何给定的技能是 "更容易"、"类似 "还是 "更难"。 这个函数将是您的 sectionNameKeyPath
.
更新
好吧,思考了一夜,我意识到我错了。 在上述情况下, sectionNameKeyPath
困难的是:问题是它取决于当前选择的技能,但该函数不能接受任何参数,所以不能 "知道 "哪个是当前选择的技能。 回到画板上....