前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxSwift介绍(一)——RxSwift初探

RxSwift介绍(一)——RxSwift初探

作者头像
我只不过是出来写写代码
发布2019-04-02 14:20:32
2.9K0
发布2019-04-02 14:20:32
举报

之前介绍了RAC在Objective-C环境下RACSignal信号订阅使用流程、宏定义以及各种信号的操作使用。作为函数式响应编程的代表,就不得不提RxSwift。 在swift环境下,RAC的孪生兄弟RxSwift同样提供了相同的框架使用,并且基于swift语言的优点,RxSwift甚至能够更简洁地开发业务代码。关于RxSwift的优点,大把大把的人在夸。我自己的感受是,虽然学习曲线比较陡峭,学习成本很高,一旦掌握了其开发技巧,收获要比想象中多,值得去学习并实践的框架。 接下来先看一个最常用的例子,swift环境中搭建一个简单的tableView。这里往往需要遵循TableView相关的各种代理方法,下面是使用结构体生成一串简单的数组并放入tableView中显示内容。

代码语言:javascript
复制
//使用结构体生成tableView的数据源
struct DemoModel {
    var firstKey:String
    var secondKey:Int
    init(firstKey:String, secondKey:Int) {
        self.firstKey = firstKey
        self.secondKey = secondKey
    }
}

struct DemoViewModel {
    let infoAry = [DemoModel(firstKey: "1-1", secondKey: 1),
                                   DemoModel(firstKey: "1-2", secondKey: 2),
                                   DemoModel(firstKey: "1-3", secondKey: 3),
                                   DemoModel(firstKey: "1-4", secondKey: 4)]
}

生成好了数据之后初始化,再来看看tableView的代码实现

tableView在swift环境下的实现

遵循的tableView代理方法还是一如既往的繁多 接下来,在使用RxSwift框架下改造上面的tableView,来感受下RxSwift的强大。 首先引入RxCocoa与RxSwift。在RxSwift中,不再需要去挨个遵循tableView的各种代理方法,直接上修改后的代码

代码语言:javascript
复制
class ViewController: UIViewController {
    
    lazy var firstTableView: UITableView = UITableView()
    let resuerId:String = "firstCell"
    let viewModel = DemoViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        createTableView()
        bindViewModel()
    }
}

extension ViewController{
    func createTableView() -> Void {
        view.addSubview(firstTableView)
        firstTableView.frame = view.bounds;
        firstTableView.backgroundColor = UIColor.orange
        firstTableView.register(UITableViewCell.self, forCellReuseIdentifier: resuerId)
    }
    
    func bindViewModel() -> Void {
//此方法将viewModel与tableView进行绑定
        viewModel.infoAry.bind(to: firstTableView.rx.items(cellIdentifier:resuerId)){
            row,model,cell in
//cell的具体显示内容可在此处自定义
            cell.textLabel?.text = "firstKey \(model.firstKey), secondKey \(model.secondKey), row = \(row)"
        }.disposed(by: disposeBag)
//点击cell的响应事件
        firstTableView.rx.modelSelected(DemoModel.self).subscribe(onNext: { (model) in
            print("select \(model.firstKey)")
        }).disposed(by: disposeBag)
    }
}


struct DemoModel {
    var firstKey:String
    var secondKey:Int
    init(firstKey:String, secondKey:Int) {
        self.firstKey = firstKey
        self.secondKey = secondKey
    }
}

struct DemoViewModel {
//结构体中的数组被包装成了Observable
    let infoAry = Observable.just([DemoModel(firstKey: "1-1", secondKey: 1),
                                   DemoModel(firstKey: "1-2", secondKey: 2),
                                   DemoModel(firstKey: "1-3", secondKey: 3),
                                   DemoModel(firstKey: "1-4", secondKey: 4)])
}

使用RxSwift框架实现的tableView,与原生实现的代码差异

  1. 不再需要声明遵循tableView的DataSource与delegate代理以及实现所有代理方法,Rx将其代理方法进行了封装。
  2. 结构体中的数据需要被RxSwift包装成了Observable信号。
  3. 在RAC中使用的组合式销毁来集中管理销毁RACSignal,而在RxSwift中与RAC类似的使用到了DisposeBag来实现Observable的集中销毁管理。在视图控制器或者其持有者将要销毁的时候,会自动释放掉绑定在它上面的资源。它是通过类似“订阅处置机制”方式实现(类似于 NotificationCenter 的 removeObserver)。

上手写代码的过程中,发现RxSwift的编译器代码提示在Xcode下实在是不友好,代码提示有时完全失效,只能手动写入其实现的方法与参数 现在了解了RxSwift框架的基本使用,在RxSwift的官方链接中也有demo可供参考,接下来一步一步深入分析RxSwift实现原理。关于RxSwift,计划在最后放几个自己用RxSwift实现的小demo,毕竟纸上得来终觉浅,还是要放到项目中体会。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档