首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对列表列表使用NSCompoundPredicate

对列表列表使用NSCompoundPredicate
EN

Stack Overflow用户
提问于 2021-07-28 14:47:50
回答 1查看 47关注 0票数 1

我有一个很大的食谱列表,每个食谱里面都有一个配料列表。我想写一个查询,它将返回同时包含“蛋”和“黄油”的食谱列表。Here is a quick screenshot of the first few recipes in my CKRecord Type.在下面的示例代码中,它不返回任何结果,但也没有错误。

理想情况下,最好包含部分搜索,例如,“鸡蛋”仍然会返回一个以“鸡蛋”为原料的食谱。如果结果将具有同时包含“鸡蛋”和“黄油”的配料的配方优先排序,然后在配方列表的较低优先级上具有具有“鸡蛋”或“黄油”的配方,这将使.and子谓词查询具有比.or,子谓词查询更高的优先级。

我发现的其他关于NSCompoundPredicate的StackOverflow帖子在处理被查询的列表时没有帮助(比如在我的示例中,我在一个食谱列表中包含了一个配料列表)。

代码语言:javascript
复制
@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)
  }

我可以用这行代码成功地返回成分中包含“黄油”或“鸡蛋”的食谱,但我希望优先考虑同时包含“鸡蛋”和“黄油”的食谱。

代码语言:javascript
复制
    let searchText: [String] = ["butter","egg"]
    let predicate = NSPredicate (format: "ANY ingredients IN %@",argumentArray: [searchText])

非常感谢您的帮助!

更新

我发现,如果我只有一个子谓词,那么返回的每个食谱都只有“鸡蛋”作为第一种成分。

代码语言:javascript
复制
let subdeptPredicate1 = NSPredicate(format: "ANY ingredients == %@", "egg")
let predicate = NSCompoundPredicate(type: .and,subpredicates: [subdeptPredicate1])

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

EN

回答 1

Stack Overflow用户

发布于 2021-07-29 16:23:48

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

这正是我想要的:

代码语言:javascript
复制
    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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68555654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档