美文网首页
RxSwift文档八(警告)

RxSwift文档八(警告)

作者: 酒茶白开水 | 来源:发表于2020-07-24 15:06 被阅读0次

    警告

    未使用disposable

    以下是有效的subscribe*bind*drive*系列函数返回的Disposable。

    将收到有关执行某些操作的警告:

    let xs: Observable<E> ....
    
    xs
      .filter { ... }
      .map { ... }
      .switchLatest()
      .subscribe(onNext: {
        ...
      }, onError: {
        ...
      })
    

    subscribe函数返回Disposable可用于取消计算和释放资源。但是,不使用它(因此不处理它)将导致错误。

    方便的终止这些调用的首选方式是使用DisposeBag,通过链式调用.disposed(by: disposeBag)或直接将disposable添加到包中。

    let xs: Observable<E> ....
    let disposeBag = DisposeBag()
    
    xs
      .filter { ... }
      .map { ... }
      .switchLatest()
      .subscribe(onNext: {
        ...
      }, onError: {
        ...
      })
      .disposed(by: disposeBag)
    

    当disposeBag销毁时,其中包含的disposable也将自动清理。

    在xs使用Completed或Error消息以可预测的方式终止的情况下,不处理订阅Disposable将不会泄漏任何资源。然而,即使在这种情况下,使用DisposeBag仍然是清理disposable的首选方式。它确保元素计算始终在可预测的时刻终止,并使代码更健壮,因为即使xs的实现改变,资源也将得到妥善清理。

    另一种确保订阅和资源与某些对象的生命周期相关联的方法是使用takeUntil运算符。

    let xs: Observable<E> ....
    let someObject: NSObject  ...
    
    _ = xs
      .filter { ... }
      .map { ... }
      .switchLatest()
      .takeUntil(someObject.deallocated) // <-- 注意takeUntil操作符
      .subscribe(onNext: {
        ...
      }, onError: {
        ...
      })
    

    这是忽略订阅Disposable的行为,这是如何使编译器不发出警告的。

    let xs: Observable<E> ....
    
    _ = xs // <-- note the underscore
     .filter { ... }
     .map { ... }
     .switchLatest()
     .subscribe(onNext: {
       ...
     }, onError: {
       ...
     })
    

    未使用的可观察序列

    将收到有关执行某些操作的警告:

    let xs: Observable<E> ....
    
    xs
      .filter { ... }
      .map { ... }
    

    此代码定义了一个可观察的序列,该xs序列从序列中过滤并映射,但随后忽略结果。

    由于此代码只定义了一个可观察的序列,然后忽略它,它实际上并没有做任何事情。

    意图可能是存储定义可观察的序列并在以后使用它...

    let xs: Observable<E> ....
    
    let ys = xs
      .filter { ... }
      .map { ... }
    

    ...或者根据该定义开始计算

    let xs: Observable<E> ....
    let disposeBag = DisposeBag()
    
    xs
      .filter { ... }
      .map { ... }
      .subscribe(onNext: { nextElement in  // <-- 注意 `subscribe*` 方法
        // 使用元素
        print(nextElement)
      })
      .disposed(by: disposeBag)
    

    相关文章

      网友评论

          本文标题:RxSwift文档八(警告)

          本文链接:https://www.haomeiwen.com/subject/qvwjlktx.html