在学习Rxswfit的过程中遇到下面这段代码时,感到有些困惑
public 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
where O.E == S {
return { source in
return { configureCell in
let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S> { (tv, i, item) in
let indexPath = IndexPath(item: i, section: 0)
let cell = tv.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! Cell
configureCell(i, item, cell)
return cell
}
return self.items(dataSource: dataSource)(source)
}
}
}
这里的函数返回一个闭包,而这个闭包又返回另一个闭包,最终返回的是一个Disposable类型
可是,为什么要这样写呢,为什么闭包又返回另一个闭包,有什么特殊意义吗?
先贴一段使用情景:
viewModel.matchViewModels
.observeOn(MainScheduler.instance)
.do(onNext: { [weak self] _ in
self?.tableView.mj_header.endRefreshing()})
.filter{ $0.isEmpty }
.bind(to: tableView.rx.items(cellIdentifier: "MatchCell", cellType: MatchCell.self)){ [weak self] (_, matchViewModel, cell) in
self?.setupMatchCell(cell: cell, matchViewModel: matchViewModel)
}.disposed(by: disposeBag)
items函数是作为参数传入到bind里面的,那再看bind的代码:
public func bind<R1, R2>(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
return binder(self)(curriedArgument)
}
可以看到configureCell对应的是R1,而bind的第二个参数也是R1,所以bind的尾随闭包其实就是configureCell,它作为参数传入到items里面对cell进行设置