我有一个很大的食谱清单,每个食谱里面都有一份配料清单。我想编写一个查询,该查询将返回一个包含“鸡蛋”和“黄油”的食谱列表。这是我的 CKRecord 类型中前几个食谱的快速截图。在下面的示例代码中,它没有返回任何结果,但也没有错误。
理想情况下,最好包含部分搜索,例如“egg”仍会返回包含“eggs”作为成分的食谱。如果结果会优先考虑包含“鸡蛋”和“黄油”成分的食谱,然后在食谱列表的较低优先级上会有包含“鸡蛋”或“黄油”的食谱,这会更好.and,subpredicates 查询的优先级高于 .or,subpredicates 查询。
在处理正在查询的列表列表时,我发现的其他有关 NSCompoundPredicate 的 StackOverflow 帖子在这里没有帮助(如在我的示例中,我在食谱列表中有一个列表 [成分])。
@objc func refresh(_ completion: @escaping (Error?) -> Void) {
let subdeptPredicate1 = NSPredicate(format: "ANY ingredients == %@", "egg")
let subdeptPredicate2 = NSPredicate(format: "ANY ingredients == %@", "butter")
let predicate = NSCompoundPredicate(type: .and,subpredicates: [subdeptPredicate1, subdeptPredicate2])
let sort = NSSortDescriptor(key: "recipe_id", ascending: false)
let query = CKQuery(recordType: "Recipe", predicate: predicate)
query.sortDescriptors = [sort]
AttachToMainThread(forQuery: query, completion)
}
我能够使用这行代码成功返回成分中包含“黄油”或“鸡蛋”的食谱,但我希望优先考虑同时包含“鸡蛋”和“黄油”的食谱。
let searchText: [String] = ["butter","egg"]
let predicate = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchText])
我感谢您的帮助!
更新
我发现,如果我只有一个子谓词,那么每个返回的食谱都只有“鸡蛋”作为第一个成分。
let subdeptPredicate1 = NSPredicate(format: "ANY ingredients == %@", "egg")
let predicate = NSCompoundPredicate(type: .and,subpredicates: [subdeptPredicate1])
我确定这就是为什么我同时使用“鸡蛋”和“黄油”时返回零结果的原因,因为它们永远不会同时出现在第一种成分中。