【问题标题】:Realm: predicate returning LazyFilterCollection - how to convert to Results<T>?领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?
【发布时间】:2017-03-20 20:08:09
【问题描述】:

我直接在数据库上使用NSPredicates 过滤我的数据库查询,但是我想更进一步并使用自定义谓词过滤返回的值 (Results&lt;T&gt;):

elements.filter { (element) -> Bool in
    return ... 
}

这个返回一个LazyFilterBidirectionalCollection - 我如何使用它并再次获得结果?

【问题讨论】:

    标签: swift realm nspredicate


    【解决方案1】:

    我们正在跟踪在 GitHub issue #2138 中添加对基于块的谓词的支持。这将允许您在 Realm 的内置原语支持之外执行自定义过滤。

    如果您有时需要使用Results&lt;T&gt; 而其他时候需要使用LazyFilterBidirectionalCollection,您可以将值包装在类型擦除的包装器中,例如AnyBidirectionalCollection&lt;T&gt;,它将任何操作转发到包装的类型,而隐藏底层集合。

    例如:

    func maybeFilter(results: Results<Foo>) -> AnyBidirectionalCollection<Foo> {
        if (condition) {
            return AnyBidirectionalCollection(results.filter { $0.foo != "bar" })
        }
        return AnyBidirectionalCollection(results)
    }
    

    【讨论】:

    • 感谢您的回复!这是否意味着目前无法实现我想要实现的目标?
    • 没错。我不希望从任意序列创建 Results&lt;T&gt; 是可能的,因为 Results&lt;T&gt; 本质上是 Realm 的实时更新视图,如果没有 Realm 知道如何重新应用任何序列,就无法实时更新已发生的过滤。
    • 好的,所以对我来说最好的选择是将其转换为 Swift 数组并对其进行过滤?
    • 您想对生成的集合做什么?如果您不关心集合的具体具体类型,您可以使用Results.filter(_:) 返回的LazyFilteredBidirectionalCollection
    • 最后一个问题:如何从一个方法中返回两者? IE。我目前返回Results&lt;MyModel&gt;,有时还想用自定义谓词过滤它,所以我需要一些东西来处理Results&lt;MyModel&gt;以及产生的LazyFilteredBidrectionalCollection...你能给我一个提示吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2021-06-17
    • 2020-03-15
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多