Преимущество AnyCancellable.store (в :) над Set <AnyCancellable>.insert (:) - PullRequest
0 голосов
/ 01 марта 2020

Экспериментируя с Combine, я видел метод AnyCancellable.store(in:) для удержания подписчиков. Мне было интересно с этой настройкой:

class Controller
{
  static var cancellables = Set<AnyCancellable>()
}

let label = UILabel(frame: .zero)

, если есть преимущество перед сохранением Subscriber с этим:

Controller.$value
  .assign(to: \UILabel.text, on: label)
  .store(in: &cancellables)

над этим:

let subscriber = Controller.$value
  .assign(to: \UILabel.text, on: label)

Controller.cancellables.insert(subscriber)

или если это в основном стилист c. Кажется, что оба работают в тестировании.

1 Ответ

1 голос
/ 01 марта 2020

Если вы знаете , что вам понадобится только одна ссылка на AnyCancellable, то вы можете сохранить прямую ссылку на нее и избежать Set<AnyCancellable>

В противном случае Нет никакой разницы, кроме стилистики c. Я предпочитаю store(in:), чтобы избежать необходимости использовать локальную переменную для поддержания читабельности. (Конечно, вы могли бы обернуть возвращаемое значение вашего конвейера в Controller.cancellables.insert, но это просто уродливое ИМО.)

Я все равно рекомендовал бы использовать подход store(in:), чтобы вы не нужно менять свою реализацию, если вам do нужно в конечном итоге удерживать больше AnyCancellable ссылок.

...