Skip to content

Files

Latest commit

DKJoneDKJone
and
Dec 16, 2016
803b313 · Dec 16, 2016

History

History
73 lines (51 loc) · 3.78 KB

Introduction.md

File metadata and controls

73 lines (51 loc) · 3.78 KB

上一页

序章 介绍

为什么我们要使用RxSwift?

我们写的绝大多数代码都包含了界面元素的事件响应。当用户操作控件时,我们需要写一个@IBAction的处理句柄去响应用户事件。我们需要订阅通知去观测何时键盘位置发生改变。当URL sessions返回一个数据时我们需要提供一个可执行的闭包。我们利用KVO去观测变量的变化。这些各种各样的机制促使我们的代码产生了不必要的复杂。有什么能比只使用一种机制去处理所有请求或响应更好的呢?Rx就是这样一种机制。

RxSwift 是官方的Reactive Extensions (也称作 Rx), (一款同时支持多种语言平台.)的实现

概念

任何一个Observable的实例都是一个队列

一个Observable队列和Swift的SequenceType相比它的核心优势就在于它依然可以接收异步元素,这是RxSwift的核心所在。其他的所有都是建立在这基础之上的。

  • 一个Observable (ObservableType)等价于一个 SequenceType
  • ObservableType.subscribe(_:)方法等价于SequenceType.generate()
  • ObservableType.subscribe(_:)需要一个观察者(ObserverType)作为参数,他将自动订阅由Observable发出的事件队列,而不是手动的用Next()方法订阅回调。

如果 一个Observable发出一个next事件(Event.next(Element)),它人可以继续发出更多的事件。但是如果它发出了一个错误事件(Event.error(ErrorType))或者一个完成事件(Event.completed),他讲不再能够发送更多的事件给订阅者。

这样介绍上面的概念更简洁:

next* (error | completed)?

用图表可以更形象的解释

--1--2--3--4--5--6--|----> // "|" = 正常停止

--a--b--c--d--e--f--X----> // "X" = 错误时停止

--tap--tap----------tap--> // "|" = 永远不停止,例如按钮的点击事件队列

这些图表称作大理石图. 你可以在RxMarbles.com.学到更多

Observables and observers (也称作 subscribers)

可订阅对象(Observables)在有订阅者之前不会执行他们的订阅闭包。例如下面这个例子,他的闭包永远不会执行因为他没有一个订阅者

example("Observable with no subscribers") {
    _ = Observable<String>.create { observerOfString -> Disposable in
        print("This will never be printed")
        observerOfString.on(.next("😬"))
        observerOfString.on(.completed)
        return Disposables.create()
    }
}

在下面这个例子中,闭包会在被订阅(subscribe(_:))时执行

example("Observable with subscriber") {
  _ = Observable<String>.create { observerOfString in
            print("Observable created")
            observerOfString.on(.next("😉"))
            observerOfString.on(.completed)
            return Disposables.create()
        }
        .subscribe { event in
            print(event)
    }
}

不要关心Observables是怎么创建的,我们将在下一章介绍.

subscribe(_:)返回一个Disposable实例代表一次性资源比如一个订阅。他在之前的简单例子中被忽略了,但是它常常正确的处理了。这意味着要将它放入了一个DisposeBag实例中,他才会被正确处理。在此后的例子中我们将包含适当的处理,因为实践出真知! 🙂. 你可以在这里获取更多Disposing section - 入门指南.

下一章 - 返回目录