【问题标题】:iOS Swift: TableView Data Source without using RxCocoaiOS Swift:不使用 RxCocoa 的 TableView 数据源
【发布时间】:2019-05-30 12:52:49
【问题描述】:

晚上,在我的应用程序中,我不想使用 RxCocoa,我正在尝试符合 tableview 数据源和委托,但我遇到了一些问题。

如果不使用 RxCocoa 或 RxDataSource,我找不到任何指南。

在我的 ViewModel 中有一个lazy computed var myData: Observable<[MyData]>,但我不知道如何获取行数。

我正在考虑将 observable 转换为 Bheaviour 主题,然后获得价值,但我真的不知道哪个是最好的做法

【问题讨论】:

    标签: ios swift uitableview datasource rx-swift


    【解决方案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)
    

    (我把所有的selfs 放在上面是为了让事情更明确。)

    您可以将其细化到有效地重新实现 RxCoca 的数据源的程度,但这有什么意义呢?

    【讨论】:

    • 我害怕远离苹果标准模式并编写很少人理解的代码。所以你认为我应该使用 rxCocoa 或者 rxDataSource?
    • 这取决于你的团队/老板,而不是我。我只是说,如果你不打算使用 RxCocoa,那么努力重新实现它是愚蠢的。以上不是重新实现,它是一个一次性的类,仅适用于特定目的。
    • 谢谢,我只是想了解您的个人意见
    • 就个人而言,我全力以赴。我认为响应式编程方法是未来。三十年前,当很多人还认为它只是一种时尚时,我就加入了 OO 潮流。我认为反应式编程是下一个重大的范式转变。恕我直言,二十年后,一切都将是被动的。
    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多