0

ViewModelOwners记录了如何使用 ReactiveCocoaCompositeDisposable

这个例子甚至是用 ReactiveCocoa 实现的。

但是,我不明白disposeBag实际是如何处理的,因为CompositeDisposable不会自动处理deinit

我正在尝试该示例并向一次性用品添加一条日志消息:

func didSetViewModel(_: ViewModel, disposeBag: CompositeDisposable) {
  disposeBag += AnyDisposable {
    print("Disposed Profile")
  }
}

释放控制器时永远不会打印该消息。

我认为您需要手动处理袋子deinit,但关联的对象没有暴露,所以我无法disposeBag进入deinit

我想出的最好的方法是使用lifetimeReactiveCocoa,如下所示:

func didSetViewModel(_: ViewModel, disposeBag: CompositeDisposable) {
  disposeBag += AnyDisposable {
    print("Disposed Profile")
  }

  self.reactive.lifetime.observeEnded {
    if !disposeBag.isDisposed {
      disposeBag.dispose()
    }
  }
}

但这似乎有问题,例如,如果这是 a ReusableViewModelOwner,那么除了最后一个 disposeBags 之外的所有内容都已被处理,但我仍然保留它们......

所以基本上,我的问题是:你应该如何使用ViewModelOwnerswith ReactiveCocoa.CompositeDisposable

4

1 回答 1

1

如问题中所述,ReactiveSwift.CompositeDisposable不会在 deinit 上自动处理。

但是 ReactiveSwift 已经有一个解决方案:ScopedDisposable它就是这样做的。

因此,原始问题的解决方案是使用ScopedDisposable<CompositeDisposable>而不是 plain CompositeDisposable

extension ScopedDisposable: ViewModelOwnerDisposeBagProtocol where Inner == CompositeDisposable {
    public convenience init() {
        self.init(CompositeDisposable())
    }

    private final class Wrapper: Disposable {
        var isDisposed: Bool
        let disposable: ViewModelOwnerDisposable

        init(_ disposable: ViewModelOwnerDisposable) {
            self.disposable = disposable
            isDisposed = false
        }

        func dispose() {
            disposable.dispose()
            isDisposed = true
        }
    }

    public func add(_ disposable: ViewModelOwnerDisposable) {
        inner.add(Wrapper(disposable))
    }
}

接着

func didSetViewModel(_ viewModel: ViewModel, disposeBag: ScopedDisposable<CompositeDisposable>) {
  disposeBag += AnyDisposable {
    print("Disposed Profile")
  }
}

文档已经相应更新

于 2019-05-16T11:59:33.630 回答