领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?
Posted
技术标签:
【中文标题】领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?【英文标题】:Realm: predicate returning LazyFilterCollection - how to convert to Results<T>? 【发布时间】:2017-03-20 20:08:09 【问题描述】:我直接在数据库上使用NSPredicate
s 过滤我的数据库查询,但是我想更进一步并使用自定义谓词过滤返回的值 (Results<T>
):
elements.filter (element) -> Bool in
return ...
这个返回一个LazyFilterBidirectionalCollection
- 我如何使用它并再次获得结果?
【问题讨论】:
【参考方案1】:我们正在跟踪在 GitHub issue #2138 中添加对基于块的谓词的支持。这将允许您在 Realm 的内置原语支持之外执行自定义过滤。
如果您有时需要使用Results<T>
而其他时候需要使用LazyFilterBidirectionalCollection
,您可以将值包装在类型擦除的包装器中,例如AnyBidirectionalCollection<T>
,它将任何操作转发到包装的类型,而隐藏底层集合。
例如:
func maybeFilter(results: Results<Foo>) -> AnyBidirectionalCollection<Foo>
if (condition)
return AnyBidirectionalCollection(results.filter $0.foo != "bar" )
return AnyBidirectionalCollection(results)
【讨论】:
感谢您的回复!这是否意味着目前无法实现我想要实现的目标? 没错。我不希望从任意序列创建Results<T>
是可能的,因为 Results<T>
本质上是 Realm 的实时更新视图,如果没有 Realm 知道如何重新应用任何序列,就无法实时更新已发生的过滤。
好的,所以对我来说最好的选择是将其转换为 Swift 数组并对其进行过滤?
您想对生成的集合做什么?如果您不关心集合的具体具体类型,您可以使用Results.filter(_:)
返回的LazyFilteredBidirectionalCollection
。
最后一个问题:如何从一个方法中返回两者? IE。我目前返回Results<MyModel>
,有时还想用自定义谓词过滤它,所以我需要一些东西来处理Results<MyModel>
以及产生的LazyFilteredBidrectionalCollection
...你能给我一个提示吗?
以上是关于领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?的主要内容,如果未能解决你的问题,请参考以下文章