iOS Swift: источник данных TableView без использования RxCocoa

Вечер, в моем приложении я не хочу использовать RxCocoa, и я пытаюсь соответствовать источнику данных tableview и делегировать, но у меня есть некоторые проблемы.

Я не могу найти никакого руководства без использования RxCocoa или RxDataSource.

В моей ViewModel есть lazy computed var myData: Observable<[MyData]>, и я не знаю, как получить количество строк.

Я думал преобразовать наблюдаемое в предмет поведения, а затем получить значение, но я действительно не знаю, что лучше всего сделать для этого.


person Andrea Miotto    schedule 03.01.2019    source источник


Ответы (1)


Вам нужно создать класс, который соответствует UITableViewDataSource, а также соответствует Observer. Быстрая и грязная версия будет выглядеть примерно так:

class DataSource: NSObject, UITableViewDataSource, ObserverType {
    init(tableView: UITableView) {
        self.tableView = tableView
        super.init()
        tableView.dataSource = self
    }

    func on(_ event: Event<[MyData]>) {
        switch event {
        case .next(let newData):
            data = newData
            tableView.reloadData()
        case .error(let error):
            print("there was an error: \(error)")
        case .completed:
            data = []
            tableView.reloadData()
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let item = data[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // configure cell with item
        return cell
    }

    let tableView: UITableView
    var data: [MyData] = []
}

Сделайте экземпляр этого класса как свойство вашего контроллера представления. Привяжите к нему свой myData следующим образом:

self.myDataSource = DataSource(tableView: self.tableView)
self.myData
    .bind(to: self.myDataSource)
    .disposed(by: self.bag)

(Я поставил все self выше, чтобы сделать вещи более понятными.)

Вы можете улучшить это до такой степени, что вы эффективно повторно реализуете источник данных RxCoca, но какой в ​​этом смысл?

person Daniel T.    schedule 04.01.2019
comment
Я боюсь слишком сильно отойти от стандартного шаблона Apple и написать код, который поймут немногие. Итак, вы думаете, что мне следует использовать rxCocoa и, возможно, rxDataSource? - person Andrea Miotto; 04.01.2019
comment
Это зависит от вашей команды/начальника, а не от меня. Я просто говорю, что если вы не собираетесь использовать RxCocoa, то было бы глупо прилагать усилия для его повторной реализации. Вышеупомянутое не является повторной реализацией, это единственный класс, который подходит только для определенной цели. - person Daniel T.; 04.01.2019
comment
спасибо, мне просто интересно ваше личное мнение - person Andrea Miotto; 04.01.2019
comment
Лично я полностью согласен. Я думаю, что будущее за реактивными подходами к программированию. Тридцать лет назад я запрыгнул на борт ООП, когда многие еще думали, что это причуда. Я рассматриваю реактивное программирование как следующий большой сдвиг парадигмы. ИМХО, через двадцать лет все будет реактивным. - person Daniel T.; 04.01.2019