使用RxSwift时,强制展开处置袋
我想使用RxSwift,但不想强制展开 当我使用[weak self]时,我得到一个错误,即self必须被展开,即在这种情况下self不能是可选的使用RxSwift时,强制展开处置袋,swift,rx-swift,Swift,Rx Swift,我想使用RxSwift,但不想强制展开 当我使用[weak self]时,我得到一个错误,即self必须被展开,即在这种情况下self不能是可选的 public func getPages() -> Observable<[(String, String)]> { return Observable.create { [weak self] observer -> Disposable in if let pages = 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将成为可选的
.subscribe{p>中的[weak self]事件。为什么不使用“unowned”而不是“weak”引用。它们之间的区别在于unowned假定self不是空的。将[weak self]替换为[unowned self]使self不是可选的,因此您不需要打开它。提供的代码有各种各样的错误……如果我理解您的意图,您只需要一个简单的共享:
let getPages = allPages()
.share(replay: 1)
订阅getPages后,share操作符将缓存发射,并将其重播给订阅它的所有其他观察者
否则,请注意,您应该从create闭包返回一次性文件。当您调用subscribe时,您正在生成一次性文件,然后将其放入dispose包中,而不是返回。相反,请执行以下操作:
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()
}
}
如果在订阅可观察对象时自我不存在,那么就完成。
如果self存在,但是pages不存在,那么调用allPages并将其绑定到观察者。
否则,发出页面并完成。
如果self被去初始化了,为什么你不能用一个守卫声明来提前退出呢?我可以,但是我会返回一个我认为是空的发布主题,如果有更好的方法,你最好返回一个值!如上所述,我使用了发布主题。另外,如果你这样做,这个self将成为可选的!好的,我理解你的意思关注点。你如何不需要强制展开self.disposeBag你避免了这个权利,因为还有另一个补全,所以你没有定义[weak self],这就是它工作的原因。添加下面的代码,你将获得该self也是可选的..订阅{[weak self]事件中,你没有自大,因为至少你在代码上的攻击和最初的凌空抽射都是错误的…如果我理解你想做什么…谢谢你的提示,没有优雅的表达。
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()
}
}