gpt4 book ai didi

ios - 带有 nil 包装的自定义 flatMapLatest

转载 作者:行者123 更新时间:2023-11-28 12:32:03 24 4
gpt4 key购买 nike

我有一些测试函数,观察者对其进行赋值并将其映射到另一个 Observable :

private func test1() {
selectedTagsVariable
.asObservable()
.flatMapLatest { [weak self] tags -> Observable<PostSet> in
guard let strongSelf = self else { return .empty() }
return strongSelf.postSetObservable(for: tags)
}
}

没关系,但我不想每次都检查 self 值为 nil。当然,我可以替换weakunowned , 但这是不正确的。

因此,我创建了自定义 flatMapLatest :

extension ObservableType {

func xflatMapLatest<A:AnyObject, O: ObservableType>(weak obj: A, selector: @escaping (A, Self.E) throws -> O) -> Observable<O.E> {
return flatMapLatest { [weak obj] value -> Observable<O.E> in
guard let strongObj = obj else {
return Observable.empty()
}
return try selector(strongObj, value) as! Observable<O.E>
}
}
}

它看起来像这样:

private func test2() {
selectedTagsVariable
.asObservable()
.xflatMapLatest(weak: self) { obj, tags -> Observable<PostSet> in
return obj.postSetObservable(for: tags)
}
}

问题:我不喜欢 xflatMapLatest 中的类型转换返回类型 ( as! Observable<O.E> ) 中的函数。我可以以某种方式删除它吗?帮助重构这个方法:)

最佳答案

你想要的是镜像 flatMapLatest运营商与一个简单的修改。看看它的签名:

func flatMapLatest<O : ObservableConvertibleType>(_ selector: @escaping (Self.E) throws -> O) -> RxSwift.Observable<O.E>

如您所见,selector 的结果类型关闭必须符合 ObservableConvertibleType ,它的定义在这里:

public protocol ObservableConvertibleType {
associatedtype E
public func asObservable() -> RxSwift.Observable<Self.E>
}

知道了这一点,就很容易看出您需要做哪些小的改变才能让它发挥作用:

extension ObservableType {
func flatMapLatestWeak<A: AnyObject, O: ObservableConvertibleType>(weak obj: A, selector: @escaping (A, E) throws -> O) -> Observable<O.E> {
return flatMapLatest { [weak obj] value -> Observable<O.E> in
guard let strongObj = obj else {
return Observable.empty()
}
return try selector(strongObj, value).asObservable()
}
}
}

此外,您可以使用 Optional<T> 缩短此方法的 map :

extension ObservableType {
func flatMapLatestWeak<A: AnyObject, O: ObservableConvertibleType>(weak obj: A, selector: @escaping (A, E) throws -> O) -> Observable<O.E> {
return flatMapLatest { [weak obj] value in
try obj.map{ try selector($0 , value).asObservable() } ?? .empty()
}
}
}

关于ios - 带有 nil 包装的自定义 flatMapLatest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41867044/

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