RxDataSource 中数据源是如何和绑定的-2

RxDataSource(3.0.1)版
RxDataSource 中数据源是如何和绑定的--tableView.rx.items: 函数实现
《1》中分析了一个简单数据源的绑定函数,现在来看一下tableView.rx.items:内部是如何实现的
打开 TableView+Rx 这个文件,可以看到tableView.rx.items 有三种重载实现方式,

重载1
func items<S: Sequence, O: ObservableType>(_ source: O)
        -> (_ cellFactory: @escaping ((UITableView, Int, S.Iterator.Element) -> UITableViewCell))
        -> Disposable

重载2
func items<S: Sequence, Cell: UITableViewCell, O : ObservableType>
        (cellIdentifier: String, cellType: Cell.Type = Cell.self)
        -> (_ source: O)
        -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
        -> Disposable

重载3
func items<DataSource: RxTableViewDataSourceType & UITableViewDataSource, O: ObservableType>
            (dataSource: DataSource)
            -> (_ source: O) -> Disposable

我们之前用到的是第一种,
其实他们的关系是 前两种实现都调用的第三种。看第一种实现:

    public func items<S: Sequence, O: ObservableType>(_ source: O)
        -> (_ cellFactory: @escaping ((UITableView, Int, S.Iterator.Element) -> UITableViewCell))
        -> Disposable
        where O.E == S {
            return { cellFactory in
                let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
                return self.items(dataSource: dataSource)(source)
            }
    }

之前分析了,他是一个 f(a) -> ( f(b) -> c) 类型的函数,也就是说他要返回的是f(b) -> c 这个类型的东西,

return { cellFactory in  
   let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
   return self.items(dataSource: dataSource)(source)
  }

//分解如下:
// f(a) -> b 类型的返回值
typealias Type = (_ cellFactory: @escaping ((UITableView, Int, S.Iterator.Element) -> UITableViewCell))
    -> Disposable

let result: Type = { cellFactory -> Disposable in
    
    let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
    
    //下面是self.items(dataSource: dataSource)(source)的分解
    //self.items(dataSource: dataSource) 这里调用了第三个rx.items的重载函数实现,返回的是一个函数
    let function: (_ source: O) -> Disposable = self.items(dataSource: dataSource)
    
    // 执行function 得到Disposable
    let disposable: Disposable = function(source)
    return disposable
}
return result

return的闭包,cellFactory 作为一个参数,再利用第三个items重载实现,完成了这个当前函数的返回值。
可以看到, cellFactory 保存到了dataSource里面,DataSource是RxTableViewReactiveArrayDataSourceSequenceWrapper类型的,里面init时将cellFactory传入保存。
印证了《1》中初步的设想,将cell构建的过程保存起来以备后期调用。

后面再分析 rx.items 第三种重载的实现

转载于:https://my.oschina.net/dahuilang123/blog/1634452

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值