领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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...你能给我一个提示吗?

以上是关于领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?的主要内容,如果未能解决你的问题,请参考以下文章

领域返回错误的数据

领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?

在联合之后只返回一条记录

PHP领域类型Java中ibatis的API

DTO(领域数据传输对象)是做什么的

什么是前端开发领域中的 time to first byte 指标