Как избавиться от DisposeBag при использовании ViewModelOwners с ReactiveCocoa - PullRequest
0 голосов
/ 15 мая 2019

ViewModelOwners описывает, как использовать с ReactiveCocoa CompositeDisposable

Пример даже реализован с ReactiveCocoa.

Однако я этого не делаюпонять, как на самом деле расположен disposeBag, поскольку CompositeDisposable не удаляется автоматически на deinit

Я пробую пример и добавляю в одноразовое сообщение журнала:

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

Сообщение никогда не печатается, когда контроллер освобождается.

Я думаю, что вам нужно будет утилизировать сумку вручную на deinit, но связанный объект не выставляется, поэтому я не могу получить disposeBag in deinit.

Лучшее, что я придумал, это использование lifetime от ReactiveCocoa, например:

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

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

Но это кажется проблематичным, например, если этоa ReusableViewModelOwner, тогда все , но последние утилизированные пакеты уже удалены, но я все еще сохраняю их ...

Итак, в основном, мой вопрос: как вы должны использовать ViewModelOwners с ReactiveCocoa.CompositeDisposable?

1 Ответ

0 голосов
/ 16 мая 2019

Как уже упоминалось в вопросе, ReactiveSwift.CompositeDisposable автоматически не удаляется на deinit.

Но ReactiveSwift уже имеет решение для этого: ScopedDisposable, которое делает именно это.

Таким образом, решение исходного вопроса заключается в использовании ScopedDisposable<CompositeDisposable> вместо простого 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")
  }
}

Документы уже обновлены соответственно

...