专栏首页一个番茄说函数响应式编程框架RxSwift 学习——Observable

函数响应式编程框架RxSwift 学习——Observable

最近开始研究RxSwift,网上能查到的资料太有限,边学边记录,有不对的地方欢迎大家指正。

按照官方自己的说法,它是swift版本的Rx,是一个提供响应函数式编程的框架。之前在iOS开发领域比较火的ReactiveCocoa也是根据Rx来的,所以在概念上基本是相同的。在GitHub上把代码取下来之后,运行官方的Demo可以看到它的很多用法。关于其中涉及到的核心概念在它的playground里也有很详细的说明。


Observable

Observable也就是一个被观察的对象,是一个事件序列,订阅者可以订阅它,监测事件的发生(Next\Complete\Error)。是不是听到这里就感觉这货有点像KVO?

热信号vs冷信号

信号分两种,热信号在它创建的时候就开始推送事件,这意味着如果后面有订阅者来的时候,就可能会错过一些事件。而冷信号则不会,只有在它被订阅的时候,它才会发送事件,这可以保证后面即使有订阅者中途加入的时候也能收到完整的事件序列。

获得Observable

要得到一个Observable有两种方式,一种是RxSwift已经提供了的(这里你可能需要引入RxCocoa),一种是自己创建。比如你有一个UITextfield,你要订阅其text的变化,就可以通过textfield.rx_text来获得这个Observable<String>的对象。如果要自己创建的话,可以利用它提供的create函数来创建,create接受函数闭包作为参数,比如我的项目里用到了Alamofire,我如果想让它的response是一个observable的,我可以这样写:

    func fetchClubList(fromPage page:Int) -> Observable<[ClubTableCellViewModel]>{
        
        return create{ (observer ) -> Disposable in
            Alamofire.request(Method.GET, "http://www.mocky.io/v2/560a046995e00cc208981280").responseArray{[unowned self]
                 (results:[ClubModel]?, err:ErrorType?) -> Void in
                    if let _ = err{
                        observer.on(Event.Error(err!))
                    }else{
                        if let cellVMs = (results?.map{ClubTableCellViewModel(club: $0)}){
                            if page == 0{
                                self.cellViewModels.removeAll()
                            }
                            self.cellViewModels.appendContentsOf(cellVMs)
                            
                            observer.on(Event.Next(self.cellViewModels))
                            observer.on(Event.Completed)
                        }else{
                            //TODO: error handle
                        }
                    }
                }
            
            return NopDisposable.instance
        }
    }

这样就创建了一个Observable<[ClubModel]>,当他上面有事件发生的时候,我们可以做相应的操作。除了create,还可以通过never()创建一个什么都不发送的空序列,用empty()创建一个空序列但会发送.Complete等等。

信号的操作

常用的操作符有map,flatMap,subscribe,doOn,retry等等,具体的用法在它的文档中有具体说明。比如在我的demo里,需要根据页码加载列表数据。可以像这样做,在我的UIViewController里先创建一个属性:

    var page : Variable<Int> = Variable(0)

接下来订阅这个page

        self.page
            .throttle(0.5, MainScheduler.sharedInstance)
            .doOn{ [unowned self] value in
                self.refreshCtrl.enabled = false
            }
            .flatMap {[unowned self] in
                self.viewModel.fetchClubList(fromPage: $0)
                    .doOn{ [unowned self] in
                        self.refreshCtrl.endRefreshing()
                        self.refreshCtrl.enabled = true
                    }
                    .retry()
                    .catchErrorJustReturn([])
            }
            .bindTo(self.clubList.rx_itemsWithCellIdentifier("clubCell")){(_, viewModel, cell: ClubListCell) in
                cell.viewModel = viewModel
            }
            .addDisposableTo(self.dispose)

这段代码里实现了在page发生变化的时候自动去请求服务端的数据,然后刷新tableview。throttle保证了事件序列发送的频率不会过快,doOn在每次.Next到来之前让我们有机会做些额外的处理,页码变化通过flatMap触发API调用,然后把得到的数据绑定到每个cell上面。

通过RxSwift整个代码量减少了很多,也变得更加易读,是不是感觉很棒!现在了解的也不够多,欢迎大家一起来交流

参考链接: http://reactivex.io/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一关系图让你理解K8s中的概念,Pod、Service、Job等到底有啥关系

    刚开始接触K8s的同学可能都会觉得有一定的学习难度,扑面而来的各种概念到底是什么。比如,如何提供一个服务给别人,我是应该用Pod还是用Deployment来运行...

    100000798482
  • Swift中防止ptrace依附

    在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防...

    100000798482
  • 你知道你用的数字钱包到底是个什么玩意儿么

    有钱就有钱包的需求,那么对应到数字货币也是一样的。然而在比特币等数字货币的世界中,我们使用的数字钱包和传统意义上的电子钱包还是有区别的,他并不是给你开一个户,然...

    100000798482
  • 详解文本分类之DeepCNN的理论与实践

    最近在梳理文本分类的各个神经网络算法,特地一个来总结下。下面目录中多通道卷积已经讲过了,下面是链接,没看的可以瞅瞅。我会一个一个的讲解各个算法的理论与实践。目录...

    zenRRan
  • python pyqt5 按钮 QRadioButton 常用

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.Qt...

    用户5760343
  • python自学成才之路 类详细用法

    python是一门面向对象编程的语言,python的类和java中的类思想上有很多一样的地方,比如python类也是通过class修饰,里面也有成员属性,成员方...

    我是李超人
  • Python GUI项目实战(一)登录窗体的设计与实现

    前面我们学习了Python GUI 图型化界面Tkinter的基础知识,为了检测我们的学习成果,学以致用。我们从今天开始做一个综合Tkinter案例--基于Tk...

    小雨编程
  • ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

    简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响...

    ios122
  • 小蛇学python(2)两百行代码实现旅游中国34座大城市最短路径

    直接说基础语法,也许大家不会感兴趣。前言之后的这一章,给大家介绍一下我最近写出来的一个小功能。用python语言实现GA算法来解决TSP问题,希望以此来激发大家...

    用户2145057
  • 【David Silver 深度强化学习教程代码实战07】 DQN的实现

    点击上方“专知”关注获取更多AI知识! 【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不...

    WZEARW

扫码关注云+社区

领取腾讯云代金券