【发布时间】:2019-08-30 18:44:26
【问题描述】:
我的 init 方法中有这段代码:
self.monitor = CoreStore.monitorSectionedList(
From<ListEntityType>()
.sectionBy(#keyPath(ListEntityType.muscle.name)) { (sectionName) -> String? in
return "\(String(describing: sectionName)) years old"
}
.orderBy(.ascending(#keyPath(ListEntityType.muscle.name)), .ascending(\.name))
)
我想以某种方式在运行时向此监视器添加.where 条件。
ListEntityType 是名为Exercise 的实体的类型别名。所以每个Exercise 都包含一对一的关系Muscle (exercise.muscle)。
每个实体都有唯一的标识符属性。
我有一组肌肉标识符,我想将其用作过滤器以显示分段列表中的对象。
如何循环通过此标识符将 then to .where 子句添加到CoreStore.monitorSectionedList
我可能期待这样的事情,但不是 100% 肯定只是假设:
让谓词 = NSPredicate(格式: "%K = $ARGUMENT")
var predicates = [NSPredicate]()
if let muscles : [MuscleGroupEntity] = workout?.muscles.toArray() {
for muscle in muscles
{
let myNewPredicate = predicate.withSubstitutionVariables(["ARGUMENT" : muscle.id])
predicates.append(myNewPredicate)
}
}
self.monitor = CoreStore.monitorSectionedList(
From<ListEntityType>()
.sectionBy(#keyPath(ListEntityType.muscle.name)) { (sectionName) -> String? in
return "\(String(describing: sectionName)) years old"
}
.where(format:"%K = %@", argumentArray: predicates)
.orderBy(.ascending(#keyPath(ListEntityType.muscle.name)), .ascending(\.name))
)
此代码因错误而崩溃:
-[NSComparisonPredicate rangeOfString:]: unrecognized selector sent to
我猜这是我找到的谓词here 中的东西,但不确定在我的情况下如何正确使用它
为 MartinM cmets 编辑:
我有一个带有 Muscle 属性的 ExerciseEntity。
如果我想只使用一块肌肉进行所有锻炼,这很简单:
.where(format:"%K = %@", #keyPath(ExerciseEntity.muscle.id), "id_12345")
但我想指定更多肌肉并在运行时定义它们。不知何故,我需要了解格式是什么,参数是什么以及如何传递标识符数组而不是一个 "id_12345"
【问题讨论】:
-
如果我错了,请纠正我,但我猜你想要一个 (id IN muscleIds) 谓词?获取所有 ListEntityTypes 其中 ListEntityType.muscle.id 包含在锻炼.muscles.ids 中?
-
@MartinM 我在上面的问题中添加了一个编辑部分。感谢您的帮助!)
标签: ios swift core-data nspredicate corestore