gpt4 book ai didi

ios - RxSwift 过滤器变量数组

转载 作者:搜寻专家 更新时间:2023-10-31 08:13:58 25 4
gpt4 key购买 nike

您好,我正在尝试了解 RxSwift 库以编写更好的功能代码。

目前我被困在一个非常基本的问题上。假设我得到了 Variable<[CiteModel?]> 类型的变量:

var allCites: Variable<[CiteModel?]> = Variable([])
var shownCites: Variable<[CiteModel?]> = Variable([])

现在我想过滤所有来自 allCites 的引用包含特定文本的数组并将它们添加到 shownCites .

这是我尝试过的方法,但它无法编译,因为在我的过滤器 block 内 $0[CiteModel?] CiteModel?我所期望的。你能向我解释一下我做错了什么吗?

private func filterCitesByQuery(query: String) {
self.shownCites = self.allCites.asObservable().filter {
$0?.cite.containsString(query)
}
}

执行上述代码时出错:

Cannot assign value of type 'Observable<[CiteModel?]>' (aka 'Observable<Array<Optional<CiteModel>>>') to type 'Variable<[CiteModel?]>' (aka 'Variable<Array<Optional<CiteModel>>>')

最佳答案

map序列的每个值执行操作。申请时mapObservable<T> , map将收到 T作为其 block 的参数。

Variable<[CiteModel?]>的情况下, Observable序列 因此T == [CiteModel?] .

因为我们真的要过滤[CiteModel?]的数组,您可以更改 filterCitesByQuery 的定义到

private func filterCitesByQuery(query: String) {
// bag probably needs to be reset here
allCites.asObservable()
.map { // map: apply a transformation to $0
// The desired transformation of $0 is to remove cite that do not contain query
$0.filter { $0.cite.containsString(query) }
}
.bindTo(shownCites)
.addDisposableTo(bag)
}

但是这个片段仍然不是最优的,因为它需要订阅 allCites待制作,我们真的不想观察它的变化。

更好的实现方式是

var allCites: Variable<[CiteModel?]> = Variable([])
var searchQuery: Variable<String> = Variable("")
var shownCites: Observable<[CiteModel?]> = Observable .combineLatest(allCites.asObservable(), searchQuery.asObservable()) {
allCites, query in
return allCites.map { cites in cites.filter { $0.cite.containsString(query) } }
}

private func filterCitesByQuery(query: String) {
searchQuery.value = query
}

这是怎么回事?

combineLatestallCites 的最后两个已知值和 searchQuery .当这些更改中的任何一个更改时,都会执行该 block 。我们现在可以订阅shownCites每次源可观察到的变化都会得到更新的值。

关于ios - RxSwift 过滤器变量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com