Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RxSwift时,强制展开处置袋_Swift_Rx Swift - Fatal编程技术网

使用RxSwift时,强制展开处置袋

使用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?

我想使用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将成为可选的


.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()
    }
}