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