使用 RxSwift 时强制展开处理袋

Force-unwrapping dispose bag while using RxSwift

我想使用 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()
    }
}

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

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

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

出现这种情况是因为你没有在二次补全中定义weak self

请看下面的代码,在这种情况下 self 将成为可选的。

.subscribe({ [弱自]事件在

为什么不使用 'unowned' 而不是 'weak' 引用。它们之间的区别在于 unowned 假定 self 不为空。将 [weak self] 替换为 [unowned self] 使 self 不再是可选的,所以你不需要解包它。

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

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

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

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

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() 并将其绑定到观察者。
  • 否则,发出页面并完成。