Swift  之 RxSwift(1)

RxSwift

官方文档结构

  1. Introduction:
  2. Subjects
  3. Transforming Observables
  4. Filtering Observables
  5. Combining Observables
  6. Error Handing Operators
  7. Observable Utility Operators
  8. Conditional and Boolean Operators
  9. Mathematical and Aggregate Operators
  10. Connectable Observable Operatiors

Observable

Observable 是观察者模式中被观察的对象,相当于一个事件序列(GeneratorType), 会向订阅者发送新产生的事件信息。

事件信息分为:

.Next(value): 表示新的事件数据
.Completed: 表示事件序列完结
.Error: 异常导致的事件序列完结

Subjects

A Subject is a sort of bridge or proxy that is available in some implementations of ReactiveX that acts both as an observer and as an Observable.

Subject可以看做是一种代理和桥梁。它既是订阅者又是订阅源,这意味着它既可以订阅其他Observables,同时又可以对他的订阅者发送事件

1. How To Create Observables ?

  1. empty:

    empty creates an empty sequence.
    The only message it sends is the .Completed message.
    
    let emptySequence = Observable<Int>.empty()
  2. never:
    never creates a sequence that never sends any element or completes.
    
    let neverSequence = Observable<Int>.never()
  3. just (一个元素)
    just represents sequence that contains one element.
    It sends two messages to subscribers.
    The first message is the value of single element and the second
    message is .Completed.
    
    let singleElementSequence = Observable.just(32)
  4. sequenceOf (一系列元素)
    sequenceOf creates a sequence of a fixed number of elements.
  5. from (将swift的序列(SequenceType) 转换为事件序列)
    from creates a sequence from SequenceType
    
    let sequenceFromArray = [1, 2, 3, 4, 5].toObservable()
  6. create (通过闭包创建序列)
    create creates sequence using Swift closure.
    This examples creates custom version of just operator.
    
    let myJust = { (singleElement: Int) -> Observable<Int> in
        return Observable.create { observer in
        observer.on(.Next(singleElement))
        observer.on(.Completed)
    
        return NopDisposable.instance
        }
    }
    
    let subscription = myJust(5)
        .subscribe { event in
            print(event)
    }
  7. generate
    generate creates sequence that generates its values and determines
    when to terminate based on its previous values.
    
    let generated = Observable.generate(
        initialState: 0,
        condition: { $0 < 3 },
        iterate: { $0 + 1 }
    )
    
    let subscription = generated
       .subscribe { event in
        print(event)
    }
  8. failWith
    create an Observable that emits no items and terminates with an error
    
    let error = NSError(domain: "Test", code: -1, userInfo: nil)
    let erroredSequence = Observable<Int>.error(error)
  9. deferred (加载延迟, 订阅者的内容相同而完全独立)
    do not create the Observable until the observer subscribes,
    and create a fresh Observable for each observer

2. How To Create Subjects

  1. PublishSubject(发送订阅者从订阅之后的事件序列)

    PublishSubject emits(发出) to an observer only those items that
    are emitted by the source Observable(s) subsequent to the
    time of the subscription.
    
    example("PublishSubject") {
        let disposeBag = DisposeBag()
    
        let subject = PublishSubject<String>()
        writeSequenceToConsole("1", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        writeSequenceToConsole("2", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("c"))
        subject.on(.Next("d"))
    }
    1 - a
    1 -  b
    1 - c
    2 - c
    1 - d
    2 - d
  2. ReplaySubject (在新订阅对象订阅的时候会补发所有已经发送过的数据列, buffize: 是缓冲区的大小, 为1时,那么新订阅者出现的时候就补发上一个事件,如果是2, 就补发2个 ,…)
    ReplaySubject emits to any observer all of the items that
    were emitted by the source Observable(s), regardless of
    when the observer subscribes.
    
    example("ReplaySubject") {
        let disposeBag = DisposeBag()
        let subject = ReplaySubject<String>.create(bufferSize: 1)
    
        writeSequenceToConsole("1", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        writeSequenceToConsole("2", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("c"))
        subject.on(.Next("d"))
    }
    print:
    1 - a
    1 - b
    2 - b // 补发1个
    1 - c
    2 - c
    1 - d
    2 - d 
  3. BehaviorSubject (在新的订阅对象订阅的时候回发送最近发送的事件,如果没有,则发送一个默认值)
    When an observer subscribes to a BehaviorSubject, it begins
    by emitting the item most recently emitted by the source
    Observable (or a seed/default value if none has yet been emitted)
    and then continues to emit any other items emitted later
    by the source Observable(s).
    
    example("BehaviorSubject") {
        let disposeBag = DisposeBag()
    
        let subject = BehaviorSubject(value: "z")
        writeSequenceToConsole("1", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        writeSequenceToConsole("2", sequence: subject).addDisposableTo(disposeBag)
        subject.on(.Next("c"))
        subject.on(.Next("d"))
        subject.on(.Completed)
    }
    print:
    1 - z
    1 - a
    1 - b
    2 - b
    1 - c
    2 - c
    1 - d
    2 - d
    1 - com
    2 - com
  4. Variable (是基于BehaviorSubject的一层封装, 它的优势: 不会被显示的终结,即:不会受到.Complete或者.Error这类终结事件,它会主动在析构的时候发送.Complete)
    Variable wraps BehaviorSubject. Advantage of using variable over
    BehaviorSubject is that variable can never explicitly complete
    or error out, and BehaviorSubject can in case Error or Completed
    message is send to it. Variable will also automatically complete
    in case it‘s being deallocated.
    
    example("Variable") {
        let disposeBag = DisposeBag()
        let variable = Variable("z")
        writeSequenceToConsole("1", sequence: variable.asObservable()).addDisposableTo(disposeBag)
        variable.value = "a"
        variable.value = "b"
        writeSequenceToConsole("2", sequence: variable.asObservable()).addDisposableTo(disposeBag)
        variable.value = "c"
        variable.value = "d"
    }

3. Transforming Observables

  1. map/select

More info in reactive.io website

example("map") {
    let originalSequence = Observable.of(1, 2, 3)

    _ = originalSequence
        .map { number in
            number * 2
        }
        .subscribe { print($0) }
}
时间: 2024-10-05 04:25:04

Swift  之 RxSwift(1)的相关文章

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

RxSwift 实战操作【注册登录】

前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是Carthage第三方管理工具导入的RxSwift3.0,关于Carthage的安装和使用,请参考Carthage的安装和使用. 最终效果 下载Demo点我 前提准备 首先请大家新建一个swift工程,然后把RxSwift引入到项目中,然后能够编译成功就行. 然后我们来分析下各个界面的需求: 注册界面

Android &amp;Swift iOS开发:语言与框架对比

转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text 从Android到Swift iOS开发:语言与框架对比 我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还

如何模块化swift中的状态?

本文和大家分享的主要是模块化swift中状态相关内容,一起来看看吧,希望对大家学习swift有所帮助. 在构建应用或设计系统的时候,最困难的事情之一就是如何建模并处理状态.当应用的某些部分处于我们意料之外的状态时,管理状态的代码也是一个非常常见的 bug 来源. 这周,让我们看一看能更容易处理并响应状态改变的编码技术 - 让代码更加强壮,不容易出错.在本文中,我不会讨论具体的框架或者更大的应用程序架构范围的更改(比如 RxSwift.ReSwift 或者使用 ELM 风格的架构,我会在之后讨论它

Awesome Swift

Awesome Swift A collaborative list of awesome Swift resources,inspired by awesome-python and listed on awesome-awesomeness. Feel free to contribute! Awesome Swift Demo Apps iOS Apple Watch OS X Dependency Managers Guides Editor Support Vim Libs Anima

RxSwift 系列(一)

为什么使用RxSwift? 我们编写的代码绝大多数都涉及对外部事件的响应.当用户点击操作时,我们需要编写一个@IBAction事件来响应.我们需要观察通知,以检测键盘何时改变位置.当网络请求响应数据时,我们必须提供闭包来执行.我们使用KVO来检测变量的变化.所有这些不同的系统使我们的代码增加了不必要地复杂.如果有一个一致的系统来处理我们的所有的调用/响应代码,难道不是更好吗?Rx就是这样一个系统. RxSwift是用于大多数主要语言和平台的响应扩展(即Rx)的正式实现. 概念 每一个Observ

Android与Swift iOS开发:语言与框架对比

Swift是现在Apple主推的语言,2014年新推出的语言,比Scala等“新”语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android NDK:在树莓派上有SwiftyGPIO库,可以通过GPIO控制一些硬件. Object C is old and ugly,oc是1983年苹果推出的,过于陈旧和臃肿. Swift语法类似Scala,Javascript ES6, Java,OC, C++, Python 这是tiobe发布的编程语言排行 Swift支持

33 个 2017 年必须了解的 iOS/swift 开源库第三方库

本文翻译自Medium,原作者为 Pawe? Bia?ecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Pawe?,我是一个独立 iOS 开发者,并且是 Enter Universe 的作者. 接近两年前我发布了 27 个iOS开源库,让你的开发坐上火箭吧.这是我在这里最棒的文章了(根据 Medium 用户的反馈来看): 如果有 15.5 万人 很担心能否跨越网络上连山排海般的文字找到最棒的 iOS 开源库,那我来传递. 跟 33 个 pod 打个

Swift 学习笔记 (一)

原创: 转载请注明出处 Extention try catch rxSwift internal  public  private var  let as       as? 强转 ? ! didSet #selector var myLabel : UILable ?      //声明全局变量myLabel 基础部分 1.可选类型 2.if 语句以及强制解析 3.隐式解析可选类型 4.错误处理 添加throws关键词来抛出错误消息 5.使用断言进行调试     let age = -3 as