gpt4 book ai didi

swift - 使用 RxSwift 时强制展开处理袋

转载 作者:行者123 更新时间:2023-11-28 13:28:56 25 4
gpt4 key购买 nike

我想使用 RxSwift 但又不想强制解包。

当我使用 [weak self] 时,我收到错误消息,必须解包 self - 即。在这种情况下,self 不能是可选的

public func getPages() -> Observable<[(String, String)]> {
return Observable.create {
[weak self] observer -> Disposable in
if let pages = self?.pages {
observer.onNext(pages)
} else {
self?.allPages()
.debug()
.subscribe({ event in
switch event {
case .next(let dta):
observer.onNext(dta)
case .error(let error):
observer.onError(error)
case .completed:
break
}
}).disposed(by: self.disposeBag)
}
return Disposables.create()
}
}

我的解决方案是在那时强制展开 self ,但这是不对的。

}).disposed(by: self!.disposeBag)

那么在这种情况下如何避免强制展开呢?

最佳答案

所提供的代码有各种各样的错误...如果我明白您要做什么,您只需要一个简单的分享:

let getPages = allPages()
.share(replay: 1)

一旦您订阅了 getPages,共享运算符将缓存发射并将其重播给订阅它的所有其他观察者。

否则,请注意您应该从 create 闭包中返回一次性用品。当您调用 subscribe 然后将一个放入处理袋而不是返回时,您正在生成一次性用品。相反,做这样的事情:

func getPages() -> Observable<[(String, String)]> {
return Observable.create { [weak self] observer in
guard let this = self else {
observer.onCompleted()
return Disposables.create()
}
guard let pages = this.pages else {
return this.allPages()
.subscribe(observer)
}
observer.onNext(pages)
observer.onCompleted()
return Disposables.create()
}
}
  • 如果在订阅 observable 时 self 不存在,则直接完成。
  • 如果 self 存在,但 pages 不存在,则调用 allPages() 并将其绑定(bind)到观察者。
  • 否则,发出页面并完成。

关于swift - 使用 RxSwift 时强制展开处理袋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57815613/

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