Вы пытаетесь передать информацию о выбранных товарах (поправьте меня, если я ошибаюсь).
Выбранные в данный момент товары
Мы не заботимся о выборе / отмене выбора, мы заботимся только о товарах,что выбрано в каждый момент времени.
Вероятно, это наиболее распространенный вариант использования, поскольку вашему пользователю (пользователю компонента) не нужно иметь локальное состояние.
protocol TopicSelectionProvider {
var selectedTopicsStream: Observable<Set<RTopic>> { get }
}
class MyTableDelegate: NSObject, UITableViewDelegate {
private var selectedTopics = BehaviourRelay<Set<RTopic>>([])
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var selected = selectedTopics.value
selected.insert(topics[indexPath.row])
selectedTopics.accept(selected)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
var selected = selectedTopics.value
selected.remove(topics[indexPath.row])
selectedTopics.accept(selected)
}
}
extension MyTableDelegate: TopicSelectionProvider {
var selectedTopicsStream: Observable<Set<RTopic>> {
return selectedTopics.asObservable()
}
}
События выбора / отмены выбора
Мы не заботимся о выбранных элементах, нас интересуют только события сами по себе.
Этот вариант использования можно использовать, когда вам нужны не элементы, а события (например, для вызовов API).
enum TopicSelectionEvent {
case select(RTopic)
case deselect(RTopic)
}
protocol TopicSelectionProvider {
var topicSelectionStream: Observable<TopicSelectionEvent> { get }
}
class MyTableDelegate: NSObject, UITableViewDelegate {
private var topicSelection = PublishSubject<TopicSelectionEvent>()
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
topicSelection.onNext(.select(topics[indexPath.row]))
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
topicSelection.onNext(.deselect(topics[indexPath.row]))
}
}
extension MyTableDelegate: TopicSelectionProvider {
var topicSelectionStream: Observable<TopicSelectionEvent> {
return topicSelection.asObservable()
}
}
Оба подхода верны и имеют за и против.Выберите тот, который подходит вам лучше всего.