Как заменить простой протокол делегирования на RxSwift? - PullRequest
0 голосов
/ 25 марта 2019

Я ищу оптимальный способ избежать определения

protocol SomeTableviewCellDelegate: class {
    func didSelectTopic(topic: RTopic)
}

и использовать вместо него RxSwift.

Я уже определил

var didSelectTopic: Observable<RTopic> {
    return _didSelectTopic.asObservable()
}
private let _didSelectTopic = PublishSubject<RTopic>()

var didDeselectTopic: Observable<RTopic> {
     return _didDeselectTopic.asObservable()
}
private let _didDeselectTopic = PublishSubject<RTopic>()

Я могу 'не могу найти правильный способ создания темы (я новичок в RxSwift).

1 Ответ

1 голос
/ 26 марта 2019

Вы пытаетесь передать информацию о выбранных товарах (поправьте меня, если я ошибаюсь).

Выбранные в данный момент товары

Мы не заботимся о выборе / отмене выбора, мы заботимся только о товарах,что выбрано в каждый момент времени.

Вероятно, это наиболее распространенный вариант использования, поскольку вашему пользователю (пользователю компонента) не нужно иметь локальное состояние.

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()
    }
}

Оба подхода верны и имеют за и против.Выберите тот, который подходит вам лучше всего.

...