美文网首页rxswiftSwift开发进阶
RxSwift 深入浅出(六)RxDataSources

RxSwift 深入浅出(六)RxDataSources

作者: Cooci_和谐学习_不急不躁 | 来源:发表于2018-08-25 16:48 被阅读210次

    RxSwift 这个框架看我就够了,这一篇我重点介绍RxDataSources在实际开发中的运用,RxDataSourcestableview的分组是特别爽的。搞RxSwift,我是认真的

    RxSwift 宝图镇博,咔咔点赞~~~~

    Rxswift
    import UIKit
    import RxSwift
    import RxCocoa
    import RxDataSources
    
    class RxSwiftTableVC: UIViewController {
        
        var myTableView:UITableView!
        let reuserId = "cell"
        let disposeB = DisposeBag()
        let datas = GithubData()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.title = "RxSwift进阶";
            self.view.backgroundColor = UIColor.white
            self.myTableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.plain)
            self.view.addSubview(self.myTableView)
            self.myTableView.register(SectionTableCell.self, forCellReuseIdentifier: reuserId)
            
            let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, SectionDataModel>>(
                configureCell: { [weak self](ds, tb, index, model) -> SectionTableCell in
                let cell = tb.dequeueReusableCell(withIdentifier: (self?.reuserId)!, for: index) as? SectionTableCell
    
               // cell?.detailTextLabel?.backgroundColor = UIColor.orange
                cell?.imageView?.image = model.image
                cell?.textLabel?.text = model.name
                cell?.detailTextLabel?.text = model.gitHubID
                return cell!
            },
                titleForHeaderInSection:{ds, index in
                    return ds.sectionModels[index].model
            })
    
            datas.githubData.asDriver(onErrorJustReturn: [])
                .drive(myTableView.rx.items(dataSource: dataSource))
                .disposed(by:disposeB)
    
            myTableView.rx.itemSelected
                .subscribe(onNext:{ [weak self] indexPath in
                   self?.navigationController?.pushViewController(RxSearchVC(), animated: true)
                })
                .disposed(by:disposeB)
    
    //        myTableView.delegate = self
            myTableView.rx.setDelegate(self).disposed(by: disposeB)
        }
       
    }
    
    
    class SectionTableCell: UITableViewCell {
        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
            super.init(style: UITableViewCellStyle.subtitle, reuseIdentifier: reuseIdentifier)
            print(#function)
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    
    struct SectionDataModel {
    
        let name: String
        let gitHubID: String
        var image: UIImage?
        
        init(name: String, gitHubID: String) {
            self.name = name
            self.gitHubID = gitHubID
            image = UIImage(named: gitHubID)
        }
    }
    
    extension SectionDataModel:IdentifiableType{
        typealias Identity = String
        var identity:Identity {return gitHubID}
    }
    
    class GithubData {
        let githubData = Observable.just([
            SectionModel(model: "A", items: [
                SectionDataModel(name: "Alex V Bush", gitHubID: "alexvbush"),
                SectionDataModel(name: "Andrew Breckenridge", gitHubID: "AndrewSB"),
                SectionDataModel(name: "Anton Efimenko", gitHubID: "reloni"),
                SectionDataModel(name: "Ash Furrow", gitHubID: "ashfurrow"),
                ]),
            SectionModel(model: "B", items: [
                SectionDataModel(name: "Ben Emdon", gitHubID: "BenEmdon"),
                SectionDataModel(name: "Bob Spryn", gitHubID: "sprynmr"),
                ]),
            SectionModel(model: "C", items: [
                SectionDataModel(name: "Carlos García", gitHubID: "carlosypunto"),
                SectionDataModel(name: "Cezary Kopacz", gitHubID: "CezaryKopacz"),
                SectionDataModel(name: "Chris Jimenez", gitHubID: "PiXeL16"),
                SectionDataModel(name: "Christian Tietze", gitHubID: "DivineDominion"),
                ]),
            SectionModel(model: "D", items: [
                SectionDataModel(name: "だいちろ", gitHubID: "mokumoku"),
                SectionDataModel(name: "David Alejandro", gitHubID: "davidlondono"),
                SectionDataModel(name: "David Paschich", gitHubID: "dpassage"),
                ]),
            SectionModel(model: "E", items: [
                SectionDataModel(name: "Esteban Torres", gitHubID: "esttorhe"),
                SectionDataModel(name: "Evgeny Aleksandrov", gitHubID: "ealeksandrov"),
                ]),
            SectionModel(model: "F", items: [
                SectionDataModel(name: "Florent Pillet", gitHubID: "fpillet"),
                SectionDataModel(name: "Francis Chong", gitHubID: "siuying"),
                ]),
            SectionModel(model: "G", items: [
                SectionDataModel(name: "Giorgos Tsiapaliokas", gitHubID: "terietor"),
                SectionDataModel(name: "Guy Kahlon", gitHubID: "GuyKahlon"),
                SectionDataModel(name: "Gwendal Roué", gitHubID: "groue"),
                ]),
            SectionModel(model: "H", items: [
                SectionDataModel(name: "Hiroshi Kimura", gitHubID: "muukii"),
                ]),
            SectionModel(model: "I", items: [
                SectionDataModel(name: "Ivan Bruel", gitHubID: "ivanbruel"),
                ]),
            SectionModel(model: "J", items: [
                SectionDataModel(name: "Jeon Suyeol", gitHubID: "devxoul"),
                SectionDataModel(name: "Jérôme Alves", gitHubID: "jegnux"),
                SectionDataModel(name: "Jesse Farless", gitHubID: "solidcell"),
                SectionDataModel(name: "Junior B.", gitHubID: "bontoJR"),
                SectionDataModel(name: "Justin Swart", gitHubID: "justinswart"),
                ]),
            SectionModel(model: "K", items: [
                SectionDataModel(name: "Karlo", gitHubID: "floskel"),
                SectionDataModel(name: "Krunoslav Zaher", gitHubID: "kzaher"),
                ]),
            SectionModel(model: "L", items: [
                SectionDataModel(name: "Laurin Brandner", gitHubID: "lbrndnr"),
                SectionDataModel(name: "Lee Sun-Hyoup", gitHubID: "kciter"),
                SectionDataModel(name: "Leo Picado", gitHubID: "leopic"),
                SectionDataModel(name: "Libor Huspenina", gitHubID: "libec"),
                SectionDataModel(name: "Lukas Lipka", gitHubID: "lipka"),
                SectionDataModel(name: "Łukasz Mróz", gitHubID: "sunshinejr"),
                ]),
            SectionModel(model: "M", items: [
                SectionDataModel(name: "Marin Todorov", gitHubID: "icanzilb"),
                SectionDataModel(name: "Maurício Hanika", gitHubID: "mAu888"),
                SectionDataModel(name: "Maximilian Alexander", gitHubID: "mbalex99"),
                ]),
            SectionModel(model: "N", items: [
                SectionDataModel(name: "Nathan Kot", gitHubID: "nathankot"),
                ]),
            SectionModel(model: "O", items: [
                SectionDataModel(name: "Orakaro", gitHubID: "DTVD"),
                SectionDataModel(name: "Orta", gitHubID: "orta"),
                ]),
            SectionModel(model: "P", items: [
                SectionDataModel(name: "Paweł Urbanek", gitHubID: "pawurb"),
                SectionDataModel(name: "Pedro Piñera Buendía", gitHubID: "pepibumur"),
                SectionDataModel(name: "PG Herveou", gitHubID: "pgherveou"),
                ]),
            SectionModel(model: "R", items: [
                SectionDataModel(name: "Rui Costa", gitHubID: "ruipfcosta"),
                SectionDataModel(name: "Ryo Fukuda", gitHubID: "yuzushioh"),
                ]),
            SectionModel(model: "S", items: [
                SectionDataModel(name: "Scott Gardner", gitHubID: "scotteg"),
                SectionDataModel(name: "Scott Hoyt", gitHubID: "scottrhoyt"),
                SectionDataModel(name: "Sendy Halim", gitHubID: "sendyhalim"),
                SectionDataModel(name: "Serg Dort", gitHubID: "sergdort"),
                SectionDataModel(name: "Shai Mishali", gitHubID: "freak4pc"),
                SectionDataModel(name: "Shams Ahmed", gitHubID: "shams-ahmed"),
                SectionDataModel(name: "Shenghan Chen", gitHubID: "zzdjk6"),
                SectionDataModel(name: "Shunki Tan", gitHubID: "milkit"),
                SectionDataModel(name: "Spiros Gerokostas", gitHubID: "sger"),
                SectionDataModel(name: "Stefano Mondino", gitHubID: "stefanomondino"),
                ]),
            SectionModel(model: "T", items: [
                SectionDataModel(name: "Thane Gill", gitHubID: "thanegill"),
                SectionDataModel(name: "Thomas Duplomb", gitHubID: "tomahh"),
                SectionDataModel(name: "Tomasz Pikć", gitHubID: "pikciu"),
                SectionDataModel(name: "Tony Arnold", gitHubID: "tonyarnold"),
                SectionDataModel(name: "Torsten Curdt", gitHubID: "tcurdt"),
                ]),
            SectionModel(model: "V", items: [
                SectionDataModel(name: "Vladimir Burdukov", gitHubID: "chipp"),
                ]),
            SectionModel(model: "W", items: [
                SectionDataModel(name: "Wolfgang Lutz", gitHubID: "Lutzifer"),
                ]),
            SectionModel(model: "X", items: [
                SectionDataModel(name: "xixi197 Nova", gitHubID: "xixi197"),
                ]),
            SectionModel(model: "Y", items: [
                SectionDataModel(name: "Yongha Yoo", gitHubID: "inkyfox"),
                SectionDataModel(name: "Yosuke Ishikawa", gitHubID: "ishkawa"),
                SectionDataModel(name: "Yury Korolev", gitHubID: "yury"),
                ]),
            ])
    }
    
    extension RxSwiftTableVC:UITableViewDelegate{
        
        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return CGFloat(arc4random_uniform(60)+32)
        }
    }
    
    

    RxDataSources的分组效果是非常爽的,我们现在看一下它的封装

        public typealias ConfigureCell = (TableViewSectionedDataSource<S>, UITableView, IndexPath, I) -> UITableViewCell
        public typealias TitleForHeaderInSection = (TableViewSectionedDataSource<S>, Int) -> String?
        public typealias TitleForFooterInSection = (TableViewSectionedDataSource<S>, Int) -> String?
        public typealias CanEditRowAtIndexPath = (TableViewSectionedDataSource<S>, IndexPath) -> Bool
        public typealias CanMoveRowAtIndexPath = (TableViewSectionedDataSource<S>, IndexPath) -> Bool
    
    

    定义了几个闭包,也是我们在分组中经常要用到的

     public init(
                    configureCell: @escaping ConfigureCell,
                    titleForHeaderInSection: @escaping  TitleForHeaderInSection = { _, _ in nil },
                    titleForFooterInSection: @escaping TitleForFooterInSection = { _, _ in nil },
                    canEditRowAtIndexPath: @escaping CanEditRowAtIndexPath = { _, _ in false },
                    canMoveRowAtIndexPath: @escaping CanMoveRowAtIndexPath = { _, _ in false },
                    sectionIndexTitles: @escaping SectionIndexTitles = { _ in nil },
                    sectionForSectionIndexTitle: @escaping SectionForSectionIndexTitle = { _, _, index in index }
                ) {
                self.configureCell = configureCell
                self.titleForHeaderInSection = titleForHeaderInSection
                self.titleForFooterInSection = titleForFooterInSection
                self.canEditRowAtIndexPath = canEditRowAtIndexPath
                self.canMoveRowAtIndexPath = canMoveRowAtIndexPath
                self.sectionIndexTitles = sectionIndexTitles
                self.sectionForSectionIndexTitle = sectionForSectionIndexTitle
            }
    

    在初始化的时候就对上面的闭包进行了默认值处理(除了configureCell),这也很好解释,因为对于分组来说,其他那些头,尾都是非必须的,cell的逻辑才是必须要的,这也就促成了它封装两个configureCell的方法的原因

    相关文章

      网友评论

        本文标题:RxSwift 深入浅出(六)RxDataSources

        本文链接:https://www.haomeiwen.com/subject/nwegiftx.html