RxSwift 系列(一) -- Observables

为什么使用RxSwift?

我们编写的代码绝大多数都涉及对外部事件的响应。当用户点击操作时,我们需要编写一个@IBAction事件来响应。我们需要观察通知,以检测键盘何时改变位置。当网络请求响应数据时,我们必须提供闭包来执行。我们使用KVO来检测变量的变化。所有这些不同的系统使我们的代码增加了不必要地复杂。如果有一个一致的系统来处理我们的所有的调用/响应代码,难道不是更好吗?Rx就是这样一个系统。

RxSwift是用于大多数主要语言和平台的响应扩展(即Rx)的正式实现。

概念

每一个Observable的实例都是一个序列

Observable序列相比于Swift序列的关键优势点在于它能够异步地接收元素。这是RxSwift精髓所在,其他的一切都扩展了这个概念。

  • Observable(ObservableType)等效于Sequence
  • observableType.subscribe(_:)方法等效于Sequence.makeIterator()
  • ObservableType.subscribe(_:)接收一个观察者ObserverType参数,它将被订阅自动接收由可观察到的序列事件和元素,而不是在返回的生成器上手动调用next()

如果一个Observable发出一个next事件(Event.next(Element)),它还能够继续发出更多的事件。但是,如果一个Observable发出一个error事件(Event.error(ErrorType))或者一个completed事件(Event.completed),那么这个Observable序列就不能给订阅者发送其他的事件了。

Observables and Observers(又名subscribers -- 订阅者)

除非有订阅者,否则Observable不会执行它们的闭包。 在下面的例子中,Observable的闭包将不会被执行,因为没有订阅者订阅。

_ = Observable<String>.create({ (observingString) -> Disposable in
        print("the code will not be executed")
        observingString.onNext("?")
        observingString.onCompleted()
        return Disposables.create()
    })

在下面的例子中,Observable的闭包将会被执行,因为有订阅者订阅。

_ = Observable<String>.create({ (observingString) -> Disposable in
        print("the code will be executed")
        observingString.onNext("?")
        observingString.onCompleted()
        return Disposables.create()
    }).subscribe({ (event) in
        print(event)
    })

我们现在不必担心上面例子中的Observable是怎样被创建出来,我会和大家一步一步深入学习。

subscribe(_:)返回一个一次性的实例,该实例表示一个可使用的资源,如订阅。在前面的简单示例中,它被忽略了,但是应该正常地处理它。这通常意味着将它添加到一个DisposeBag实例中。

Creating and Subscribing to Observables

有几种方式创建和订阅Observables:

注意:此处用到了subscribe(onNext:)的便利构造方法,有部分参数使用的是默认值。

致谢

若发现有错误的地方,欢迎各位评论,感谢!同时也希望能够帮助到有需要的同学。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏difcareer的技术笔记

so加固-加密特定section中的内容

本文参考自:Android逆向之旅—基于对so中的section加密技术实现so加固,增加了自己的实践过程,以及一些额外的验证和解释。

1784
来自专栏ChaMd5安全团队

CryptoShield勒索病毒分析

这篇文章主要分析一下Cryptoshield,来自于RITEST RIG EK的一个勒索病毒。病毒样本可以从这里得到: http://www.malware-t...

3945
来自专栏草根专栏

使用xUnit为.net core程序进行单元测试(1)

一. 导读 为什么要编写自动化测试程序(Automated Tests)? 可以频繁的进行测试 可以在任何时间进行测试,也可以按计划定时进行,例如:可以在半夜进...

3445
来自专栏乐沙弥的世界

Linux/Unix shell sql 之间传递变量

       灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell s...

943
来自专栏Linux驱动

19.QT-事件发送函数sendEvent()、postEvent()

4215
来自专栏Linux驱动

19.QT-事件发送函数sendEvent()、postEvent()

1063
来自专栏技术沉淀

Python: os模块实例详解

1823
来自专栏Java帮帮-微信公众号-技术文章全总结

Java开发框架必会Struts2第三天

今天的内容全都是重点 一、Struts2中的拦截器(特别重要) 1、拦截器的重要性 Struts2中的很多功能都是由拦截器完成的。比如:servletConfi...

37610
来自专栏后端沉思录

JWT

上图文字来自https://jwt.io/introduction/ 现项目中的JWT来解析如下:

3582
来自专栏ChaMd5安全团队

【首发】记DedeCMS一处由哈希长度拓展攻击引起的越权漏洞

漏洞影响:Dedecms(织梦CMS) V5.7.72 正式版20180109 (最新版)

2113

扫码关注云+社区

领取腾讯云代金券