美文网首页Swift编程swift
RxSwift之双向绑定实战

RxSwift之双向绑定实战

作者: 慕_風 | 来源:发表于2019-08-13 17:11 被阅读9次
什么是双向绑定?双向绑定是View与Model之间的一种相互响应的关系。

下面👇以一个Demo实战来体验一下双向绑定带来的快感!!!

Demo要实现的功能比较简单:在搜索框中输入搜索内容 -> 发起网络请求获取搜索结果 -> 在tableView中展示搜索结果。
PS:UI代码请小伙伴随意脑补,就不赘述啦

1、创建ViewModel

在UI搭建好之后,需要创建一个ViewModel类,来响应UI的变化。

class BOViewModel: NSObject {

    // 响应SearchBar的输入
    let searchTextOB = BehaviorSubject(value: "")
}

添加属性 searchTextOB 来响应输入框的输入变化,同时为了能在收到响应后,发起网络请求,所以使用了 BehaviorSubject类型。毕竟,Subject 类型可以是序列,也可以是观察者。

2、绑定UI到Model

class TBViewController: UIViewController {

    @IBOutlet weak var searchBar: UISearchBar!
    
    @IBOutlet weak var tableView: UITableView!
    
    let viewModel = BOViewModel()
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 实现 view -绑定-> model
        self.searchBar.rx.text.orEmpty
            .bind(to: self.viewModel.searchTextOB)
            .disposed(by: self.disposeBag)
    }
}

使用 bind 函数,完成输入框绑定到Model。

3、创建懒加载搜索结果序列

lazy var searchData: Driver<[BOReposityModel]> = {
    
}()

为了只产生一个可观察序列,所以使用懒加载。不需要错误处理,所以使用 Driver 对象。

在懒加载内部,将 searchTextOB 作为可观察序列订阅。即在 searchTextOB 收到外界输入框的输入变化时,同步发送信号,发起网络请求。

lazy var searchData: Driver<[BOReposityModel]> = {
    
    return self.searchTextOB.asObservable()
        // 每隔300毫秒请求一直,并且在主线程发起请求 
        .throttle(0.3, scheduler: MainScheduler.instance)
        // 阻止发送相同的信号
        .distinctUntilChanged()
        .flatMapFirst(BOViewModel.requestData)
        // 如果出错,则返回空数组
        .asDriver(onErrorJustReturn: [])
}()
  • 为了防止请求过快,所以间隔300毫秒才在主线程发起一起请求。
  • 除非接收到不一样的信号,才会发起响应。
  • 而且还做了错误处理,如果出错了,则返回空数组。
  • flatMapFirst 函数接收一个闭包作为参数,但其实闭包也是一个函数,所以这里传入一个函数作为参数也是可以的。

4、发起网络请求

本例中使用的请求地址为:https://api.github.com/users/(githunId)/repos

在发起网络请求之前需要先判断传入的参数是否为空,已经网络地址是否正确。如果有错误,则返回空数组。

static func requestData(_ githubId: String) -> Observable<[BOReposityModel]> {
    
    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()
        .observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
        .map(BOViewModel.parseData)
}

使用 URLSession 发起异步网络请求,并且对请求的结果进行数据解析。

5、数据解析

class BOReposityModel: HandyJSON {

    var name: String = ""
    var url: String  = ""
    
    required init() {}
}
static func parseData(_ json: Any) -> [BOReposityModel] {
    
    guard let datas = json as? [[String: Any]] else { return [] }
    
    guard let result = [BOReposityModel].deserialize(from: datas) else { return [] }
    
    return result as! [BOReposityModel]
}

这里使用了一个三方库 HandyJSON 进行数据解析,小伙伴也可以根据自己的喜好和习惯,选择自己熟悉的数据解析方式。

6、绑定Model到UI

请求到数据以后,就需要将数据展示到页面上。

1、展示搜索结果数量到导航栏上

// 实现 model -绑定-> view
self.viewModel.searchData.map { (array) -> String in
    return "共\(array.count)个结果"
    }
    .drive(self.navigationItem.rx.title)
    .disposed(by: self.disposeBag)

2、展示结果到tableView列表上

// 实现 model -绑定-> view
self.viewModel.searchData.drive(self.tableView.rx.items){
    (tableView, row, model) in
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! BOTableViewCell
    
    cell.nameLabel.text = model.name
    cell.urlLabel.text = model.url
    
    return cell
    }
    .disposed(by: self.disposeBag)

searchData 作为请求结果序列,直接驱动 tableView 的显示刷新。

附个demo图:UI太丑,勿喷

使用这样的方式,无需再实现 UITableViewdelegatedataSource 协议方法。是不是简单很多?

RxSwift已经帮我们封装好了UITableView的代理协议,所以我们可以更专注于业务层以及UI层面,而不再需要各种冗余的代码。

使用 RxSwift 双向绑定来实现简单的搜 Demo,ViewController 中的代码不过区区60行左右,如果使用非RxSwift的方式,代码至少百行。这仅仅是计算Controller中的代码,还不包括ViewModel。这么好用的框架此时不用,更待何时?

好的框架需要学习,好的技术需要实战。

相关文章

  • RxSwift之双向绑定实战

    什么是双向绑定?双向绑定是View与Model之间的一种相互响应的关系。 下面?以一个Demo实战来体验一下双向绑...

  • RxSwift(九)-- 双向绑定

    在之前我们的举例、使用的时候,我们所有的绑定都是单向的,但是,有时候我们还是需要双向绑定的。就比如说,把某个控件的...

  • RxSwift-双向绑定

    UI响应model model绑定到UI 待完善

  • RxSwift(11)双向绑定

    1:一组tableView的绑定 点击事件 去掉点击事件 移动事件 删除事件 新增事件 注意:一定要 [weak ...

  • 双向绑定

    直接使用RxSwift Demo中定义好的双向绑定运算符(<->),在Operators.swift文件中,直接把...

  • 音乐播放

    rxswiftPlayer 这是一个音乐播放器,基于swift与rxswift双向绑定架构编写,git地址 简易播...

  • RxSwift-MVVM双向绑定

    RxSwift 篇章已经接近尾声,回首这个历程很累但很充实:白天备课,晚上VIP上课!忙里偷闲写下了这个篇章。可以...

  • RxSwift<9> —— MVVM双向绑定

    RxSwift 遇到tableView TableView的点击、复选、新增、删除、移动全部简洁实现 RxSwif...

  • RxSwift(24)——MVVM双向绑定

    在项目开发中,除了常用的MVC开发模式,还有一种常用的开发模式就是MVVM。 1.什么是MVVM?MVVM是Mod...

  • RxSwift+Moya网络请求之项目实战

    RxSwift+Moya之项目实战 RxSwift相关基本介绍和用法可参考: RxSwift的使用详解01 RxS...

网友评论

    本文标题:RxSwift之双向绑定实战

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