概念

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

- Observable(ObservableType) 等效于 Sequence
- observableType.subscribe(_:)方法等效于 Sequence.makeIterator()
- ObservableType.subscribe(_:)接受一个观察者参数,它将被订阅自动接收由可观察到的序列事件和元素,而不是在返回的生成器上手动调用 `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 willbe executed")
            observingString.onNext("😆")
            observingString.onCompleted()
            return Disposables.create()
        }).subscribe({ (event) in
            print(event)
        })

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

Creating and Subscribing to Observables

有几种方式创建和订阅 Observables

  • never 创建一个永不终止且不发出任何事件的序列,官方图解
    Observable<String>.never().subscribe { (_) in
              print("this will never be printed")
          }.disposed(by: disposeBag)
    
  • empty 创建一个只发送 completed 事件的空 Observable 序列 官方图解

  • just 创建一个只有一个元素的Observable序列。官方图解

  • of 创建一个固定数量元素的Observable序列。

    Observable.of("元素1","元素2","元素3","元素4","元素5").subscribe(onNext: { (element) in
              print(element)
          }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
    

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

  • from 从一个序列(如Array/Dictionary/Set)中创建一个Observable序列。
Observable.from(["元素1","元素2","元素3","元素4","元素5"]).subscribe(onNext: {
            print($0)
        }).disposed(by: disposeBag)

注意:这个例子使用了默认参数$0而不是显式地命名参数。

  • create 创建一个自定义的Observable序列。更多详情
let myjust = {(element: String) -> Observable<String> in

            return Observable<String>.create { (observer) -> Disposable in
                observer.on(.next(element))
                observer.on(.completed)
                return Disposables.create()
            }
        }

myjust("篮球").subscribe { (element) in
    print(element)
}.disposed(by: disposeBag)
  • range 创建一个Observable序列,它会发出一系列连续的整数,然后终止。更多详情
Observable.range(start: 1, count: 10).subscribe({print($0)}).disposed(by: disposeBag)
  • repeatElement 创建一个Observable序列,它可以无限地释放给定元素。更多详情
Observable.repeatElement("🏀").take(3).subscribe(onNext: {print($0)}, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)

上述例子中take操作符从一个序列开始返回指定数量的元素。

  • generate 创建一个Observable序列,只要提供的条件值为true就可以生成值。

    Observable.generate(initialState: 4, condition: {$0<9}, iterate: {$0 + 1}).subscribe(onNext: {print($0)}, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
    
  • deferred 为每一个订阅者创建一个新的Observable序列。更多详情

    var count = 1
          let defferedSequen = Observable<String>.deferred {
              print("count = \(count)")
              count += 1
              return Observable.create({ (observable) -> Disposable in
                  observable.onNext("🐐")
                  observable.onNext("🐗")
                  observable.onNext("🐱")
                  return Disposables.create()
              })
          }
    
          defferedSequen.subscribe(onNext: {
              print($0)
          }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
          defferedSequen.subscribe(onNext: {
              print($0)
          }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
    
  • error 创建一个不会发送任何条目并且立即终止错误的Observable序列。 ```swift Observable.error(TestError.test).subscribe { print($0) }.disposed(by: disposeBag)

- do
为每个发出的事件调用一个副作用操作,并返回(通过)原始事件。更多详情

```swift
Observable.of(["元素1","元素2","元素3","元素4","元素5"]).do(onNext: {
            print("next: \($0)")
        }, onError: { (error) in
            print("error: \(error)")
        }, onCompleted: {
            print("complete")
        }).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

results matching ""

    No results matching ""