SwiftData多条件查询Predicate编译超时问题求助
解决SwiftData多条件Predicate编译器类型检查超时问题
方法1:拆分条件为独立Predicate再组合
SwiftData的Predicate支持通过||运算符直接组合多个Predicate实例,这种方式让编译器逐个处理子条件,规避复杂表达式带来的类型检查压力。
static func GetCardsToLearnPredicate() -> Predicate<Card> { let todayMinus3Days = Date.now.addDay(day: -3) let todayMinus7Days = Date.now.addDay(day: -7) let todayMinus14Days = Date.now.addDay(day: -14) let todayMinus30Days = Date.now.addDay(day: -30) let box1Predicate = #Predicate<Card> { $0.box == 1 } let box2Predicate = #Predicate<Card> { $0.box == 2 && $0.lastStatusChange >= todayMinus3Days } let box3Predicate = #Predicate<Card> { $0.box == 3 && $0.lastStatusChange >= todayMinus7Days } let box4Predicate = #Predicate<Card> { $0.box == 4 && $0.lastStatusChange >= todayMinus14Days } let box5Predicate = #Predicate<Card> { $0.box == 5 && $0.lastStatusChange >= todayMinus30Days } return box1Predicate || box2Predicate || box3Predicate || box4Predicate || box5Predicate }
方法2:在Predicate闭包内分步计算子条件
#Predicate闭包允许内部先将子条件赋值给临时变量,再组合结果。这种分步写法降低了编译器的类型检查复杂度,避免超时。
static func GetCardsToLearnPredicate() -> Predicate<Card> { let todayMinus3Days = Date.now.addDay(day: -3) let todayMinus7Days = Date.now.addDay(day: -7) let todayMinus14Days = Date.now.addDay(day: -14) let todayMinus30Days = Date.now.addDay(day: -30) return #Predicate<Card> { card in let isBox1 = card.box == 1 let isBox2Eligible = card.box == 2 && card.lastStatusChange >= todayMinus3Days let isBox3Eligible = card.box == 3 && card.lastStatusChange >= todayMinus7Days let isBox4Eligible = card.box == 4 && card.lastStatusChange >= todayMinus14Days let isBox5Eligible = card.box == 5 && card.lastStatusChange >= todayMinus30Days return isBox1 || isBox2Eligible || isBox3Eligible || isBox4Eligible || isBox5Eligible } }
原因说明
Swift的类型检查器在处理多层嵌套逻辑表达式时性能容易下降,尤其是#Predicate闭包需要将Swift代码转换为Core Data查询表达式,额外增加了编译负担。拆分条件能让编译器逐个处理子逻辑,避免超时问题。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

