【问题标题】:How to prevent the observables from getting terminated如何防止可观察对象被终止
【发布时间】:2018-10-09 10:06:47
【问题描述】:
let loadNextPageTrigger = PublishSubject<Void>()

let loading = Variable<Bool>(false)


let nextPageRequest = loading.asObservable()

    .sample(loadNextPageTrigger)

    .flatMap { [unowned self] loading -> Observable<Int> in

        if (loading || self.pageStatus != true || self.netStatus != true) {

            return Observable.empty()

        }
        else
        {

            return Observable<Int>.create
                { [unowned self] observer in

                    print("self.pageIndex called",self.offset)

                    self.offset += 20

                    observer.onNext(self.offset)

                    observer.onCompleted()

                    return Disposables.create()

            }

        }

}

在返回 obervable.empty() 时,它会终止 Observable。

【问题讨论】:

    标签: swift rx-swift


    【解决方案1】:

    您需要使用单例来管理您的代码。这样可以保持可观察性,这将贯穿整个应用程序。从单例类中使用

    【讨论】:

      【解决方案2】:

      你可以避免在这种情况下返回一个 observable:

      let nextPageRequest = loading.asObservable()
      
          .sample(loadNextPageTrigger)
      
          .flatMap { [unowned self] loading -> Observable<Int> in 
      
                  return Observable<Int>.create { [unowned self] observer in
      
                          print("self.pageIndex called",self.offset)
      
                          self.offset += 20
      
                          observer.onNext(self.offset)
      
                          observer.onCompleted()
      
                          return Disposables.create()
      
                  }
      
      
      }
      

      此外,如果您需要该表达式的状态,您也可以传递它:

      让 nextPageRequest = loading.asObservable()

          .sample(loadNextPageTrigger)
      
          .flatMap { [unowned self] loading -> Observable<(Bool, Int)> in 
      
                  return Observable<(Bool, Int)>.create { [unowned self] observer in
      
                          print("self.pageIndex called",self.offset)
      
                          self.offset += 20
      
                          let status = loading || self.pageStatus != true || self.netStatus != true
      
                          observer.onNext(status, self.offset)
      
                          observer.onCompleted()
      
                          return Disposables.create()
      
                  }
      
      
      }
      

      【讨论】:

        【解决方案3】:
        1. 根据 RxSwift v4.x,不推荐使用变量
        2. 当某些东西在 iOS 中意外终止时,通常是因为它被释放了。如果您使用的是 Swinject 等 DI,请使用容器范围声明包含您的 observable 的类:'container.register(MyClass.self) { _ in MyClass() }.inObjectScope(.container)'

        【讨论】:

          【解决方案4】:

          您遇到的问题与您发布的代码无关。 flatMap 不允许 .completed 事件转义它,这就是 empty() 构造函数发出的所有内容。

          换句话说,返回 .empty() 不是您的 observable 终止的原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-05
            • 2019-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多