RxSwift学习中遇到的一个闭包使用技巧

在学习Rxswfit的过程中遇到下面这段代码时,感到有些困惑

    public func items
        (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 { (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(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
         return binder(self)(curriedArgument)
    }

可以看到configureCell对应的是R1,而bind的第二个参数也是R1,所以bind的尾随闭包其实就是configureCell,它作为参数传入到items里面对cell进行设置

你可能感兴趣的:(RxSwift学习中遇到的一个闭包使用技巧)