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 第三种重载的实现