1

我有一个很大的食谱清单,每个食谱里面都有一份配料清单。我想编写一个查询,该查询将返回一个包含“鸡蛋”和“黄油”的食谱列表。这是我的 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])

我确定这就是为什么我同时使用“鸡蛋”和“黄油”时返回零结果的原因,因为它们永远不会同时出现在第一种成分中。

4

1 回答 1

0

这是我的错误。我发现我解析 csv 文件的方式导致了问题。请注意,第一个成分是唯一在单词开头没有空格的成分。

这正是我想要的:

    let searchTextA: [String] = ["egg"," egg"]
    let subPred1 = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchTextA])
    
    let searchTextB: [String] = ["butter"," butter"]
    let subPred2 = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchTextB])
    
    let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [subPred1, subPred2])
于 2021-07-29T16:23:48.383 回答