美文网首页Swift开发进阶
RxSwift 深入浅出(八)开发总结

RxSwift 深入浅出(八)开发总结

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

    RxSwift 这个框架看我就够了,这一篇我重点介绍RxSwift在开发中的总结,数据请求,数据格式转换,数据联动,数据绑定。搞RxSwift,我是认真的

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

    Rxswift
    import Foundation
    import RxSwift
    import RxCocoa
    
    struct Repository {
        let name: String
        let url: String
    }
    
    
    class RxNewSearchViewModel {
        
        let searchText = Variable("")
        
        lazy var searData:Driver<[Repository]> = {
            return self.searchText.asObservable()
                .throttle(0.5, scheduler: MainScheduler.instance)//不能一直回调,隔0.5秒
                .distinctUntilChanged()//防重复
                .flatMapLatest(RxNewSearchViewModel.RepositoiesFor)
                .asDriver(onErrorJustReturn: [])
        }()
        
        static func RepositoiesFor(_ githubId:String)->Observable<[Repository]> {
            
            //防空,防非Url
            guard !githubId.isEmpty, let url = URL(string: "https://api.github.com/users/\(githubId)/repos") else {
                return Observable.just([])
            }
            
            return URLSession.shared.rx.json(url: url)
                .retry(3)
                .observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
                .map(parse)
        }
        
        static func parse(json:Any) -> [Repository]{
            guard let items = json as? [[String:Any]] else { return [] }
            var repose = [Repository]()
            items.forEach { (item) in
                guard let name = item["name"] as? String,
                    let url = item["html_url"] as? String else {return}
                
                repose.insert(Repository(name: name, url: url), at: 0)
            }
            return repose
        }
        
    }
    
    • 这里是数据请求利用的是:URLSession.shared.rx.json
    • 数据格式转换,序列化 转成我们需要的常规模型:Repository
    • 数据联动,通过绑定一个序列,牵连外面的搜索内容
    import UIKit
    import RxSwift
    import RxCocoa
    import RxDataSources
    
    
    class RxNewSearchVc: UIViewController {
        
        //通过参数searchResultsController传nil来初始化UISearchController,意思是我们告诉search controller我们会用相同的视图控制器来展示我们的搜索结果,如果我们想要指定一个不同的view controller,那就会被替代为显示搜索结果。
        let searchController = UISearchController(searchResultsController: nil)
        var searchBar: UISearchBar{return searchController.searchBar}
        var myTableView:UITableView!
        let reuserId = "cell"
        let disposeB = DisposeBag()
        let viewModel = RxNewSearchViewModel()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.title = "RxNetworkSearch";
            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)
    
            searchController.obscuresBackgroundDuringPresentation = false
            searchBar.showsCancelButton = true
            searchBar.placeholder = "请输出你要搜索的内容"
            myTableView.tableHeaderView = searchController.searchBar
            //只要在要实现搜索功能的控制器里设置:self.definesPresentationContext = YES;即可实现UISearchController的UISearchBar跟随self.view一起滑动。
            definesPresentationContext = true
            
            
            viewModel.searData
                .drive(myTableView.rx.items){ (tb, row, model) -> UITableViewCell in
                    let cell = tb.dequeueReusableCell(withIdentifier: self.reuserId) as? SectionTableCell
                    cell?.textLabel?.text = model.name
                    cell?.detailTextLabel?.text = model.url
                    return cell!
                }
                .disposed(by:disposeB)
            
            searchBar.rx.text.orEmpty
                .bind(to: viewModel.searchText)
                .disposed(by: disposeB)
            
            
            viewModel.searData.asDriver()
                .map { (repose) -> String in
                    return "\(repose.count)个 搜索结果"
            }
                .drive(navigationItem.rx.title)
                .disposed(by: disposeB)
            
            
            myTableView.rx.didEndDecelerating
                .subscribe(onNext: { [weak self]() in
                    self?.searchBar.endEditing(true)
                })
                .disposed(by: disposeB)
            
        }
    }
    
    
    • 数据绑定我们的searchBar
    • 数据绑定到myTableView

    RxSwift是一个非常nice的框架,给了我们很多的封装,流程简化,代码精简。但是有一个BUG:就是会上瘾。还有学习成本还是有一定难度的。

    相关文章

      网友评论

        本文标题:RxSwift 深入浅出(八)开发总结

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