美文网首页
RxSwift_01_可观察序列

RxSwift_01_可观察序列

作者: MR_詹 | 来源:发表于2021-03-05 10:50 被阅读0次

首先理清以下几个概念(也是小编理解RxSwift的突破口)
什么是观察者,什么是可被观察者

实现ObserverType协议的是观察者,比如类 Observer
实现ObservableType协议的是可观察序列,比如类 Observable
实现ControlPropertyType协议(此协议继承了ObserverType和ObservableType)的则既是观察者,也可以是被观察者,比如结构体ControlProperty

土话理解:观察者与可被观察者
观察者:就是观察监听,然后根据其他人的信息接收输入
可被观察者: 就是被监听的,然后内容输出给他人的

Observable定义

(1)Observable<T>

  • Observable<T>这个类是Rx框架的基础,可以称它为可观察序列
    它的作用是以异步产生一系列的Event(事件),即一个Observable<T>对象会随着事件推移不定期地发出event(element:T)

  • 而且这些Event还可以携带数据,它的泛型<T>就是用来指定这个Event携带的数据的类型

  • 有了可观察序列,还需要一个Observer(订阅者)来订阅它,这样这个订阅者才能收到Observable<T> 发出的 Event

(2)Event
Even源码如下
Event是一个枚举,也就是说一个Observable是可以发出3种不同类型的Event事件

next: next事件就是那个可以携带数据<T>的事件,可以说它是一个最正常的事件

error:error事件表示一个错误,可以携带具体的错误内容,一旦Observable发出了error event,则这个Observable就等于终止了,以后它不会在发出event事件了

completed: completed事件表示Observable发出的事件正常结束了,跟error一样,一旦Observable发出了completed event,则这个Observable就等于终止了,以后它再也不会发出event事件了

@frozen public enum Event<Element> {
    /// Next element is produced.
    case next(Element)

    /// Sequence terminated with an error.
    case error(Swift.Error)

    /// Sequence completed successfully.
    case completed
}

创建可观察序列Observable

1、jus()

传入一个默认值初始化,构建一个只有一个元素的Observable队列,订阅完自动complete

let array = ["A","B"]
/// 创建一个类型为[String]的可被观察者Observable,
/// 那么Observable所发出的事件携带的数据类型必须是[String]类型
Observable<[String]>.just(array)
    .subscribe { (item) in
        print(item)
    } onError: { (erro) in
        print("error")
    } onCompleted: {
        print("completed")
    } onDisposed: {
        print("disposed")
    }.disposed(by: disposeBag)

/// 打印结果
/// ["A", "B"]
/// completed
/// disposed

2、of()

创建一个可以携带多个元素(必须是同类型的)的可观察序列

Observable<String>.of("A","B","C","D")
  .subscribe { (item) in
    print(item)
  } onError: { (error) in
    print(error)
  } onCompleted: {
    print("completed")
  } onDisposed: {
    print("disposed")
  }.disposed(by: disposeBag)

/// 打印结果:
/// A
/// B
/// C
/// D
/// completed
/// disposed

3、from()

(1)将可选内容转为可观察序列,也就是说会对我们的可选类型进行处理(如果可选类型是nil,那么不执行onNext直接执行completed; 如果可选类型不为nil,那么会自动解包)

let a:Int? = 1
Observable.from(optional: a)
    .subscribe { (item) in
        print(item)
    } onError: { (error) in
        print(error)
    } onCompleted: {
        print("completed")
    } onDisposed: {
        print("disposed")
    } .disposed(by: disposeBag)

/// 打印结果:
/// 1
/// completed
/// disposed

(2)从集合(数组,集合,set)中获取序列(有可选项处理,更安全)
有点集合遍历的效果

Observable.from(["A","B","C"])
    .subscribe { (item) in
        print(item)
    } onError: { (error) in
        print(error)
    } onCompleted: {
        print("completed")
    } onDisposed: {
        print("disposed")
    }.disposed(by: disposeBag)

/// 打印结果:
/// A
/// B
/// C
/// completed
/// disposed

4、empty()

创建一个空内容的observable序列

let observable = Observable<Int>.empty()
        observable.subscribe { (value) in
            print(value)
        } onError: { (error) in
            print(error)
        } onCompleted: {
            print("completed")
        } onDisposed: {
            print("disposed")
        }.disposed(by: bag)

/// 打印结果:
/// completed
/// disposed

5、never()

创建一个永不会发出Event(也不会终止)的Observable序列

let observable = Observable<Int>.never()

6、error()

创建一个不做任何操作,直接发送一个错误的Observable序列

enum MyError: Error {
    case A
    case B
}

let observable = Observable<Int>.error(MyError.A)
observable.subscribe { (value) in
    print(value)
} onError: { (error) in
    print("error:",error)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("disposed")
}

/// 输出结果:
/// error: A
/// disposed

7、range()

通过指定起始值和结束数值,创建一个以这个范围内所有值作为初始值得Observable序列

let observable = Observable.range(start: 0, count: 5)
observable.subscribe { (value) in
    print(value)
} onError: { (error) in
    print(error)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("disposed")
}.disposed(by: bag)  

/// 输出结果:
/// 0
/// 1
/// 2
/// 3
/// 4
/// completed
/// disposed

8、repeatElement()

创建一个可以无限发出给定元素的Event的Observable序列

let observable = Observable.repeatElement(1)
observable.subscribe { (value) in
    print(value)
} onError: { (error) in
    print(error)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("disposed")
}.disposed(by: bag)


/// 打印结果:
/// 1
/// 1
/// 1
/// 1
/// ...

9、generate()

根据提供的条件判断,如果为true的时候,才会发出动作的observable序列

/// initalState : 初始值
/// condition : 产生条件
/// iterate :   迭代变化
let observable = Observable.generate(initialState: 0, condition: {
    $0 <= 10
}, iterate: {
    $0 + 2
})

observable.subscribe { (value) in
    print(value)
} onError: { (error) in
    print(error)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("disposed")
}.disposed(by: bag)


/// 打印结果:
/// 0
/// 2
/// 4
/// 6
/// 8
/// 10
/// completed
/// disposed

10、create()

通过一个block形式的参数,对每一个订阅进行处理

let observable = Observable<String>.create { observer in
    observer.onNext("create")
    observer.onCompleted()
    return Disposables.create()
}

observable.subscribe { (value) in
    print(value)
} onError: { (error) in
    print(error)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("disposed")
}.disposed(by: bag)

/// 打印结果:
/// create
/// completed
/// disposed

11、deferred()

相对于创建一个Observable工厂,通过传入一个block来执行延迟Observable序列创建的行为,而这个block里就是真正实例化序列对象的地方

var isOdd = true

let factory: Observable<Int> = Observable.deferred {
    isOdd = !isOdd
    if isOdd {
        return Observable.of(1,3,5,7)
    }else{
        return Observable.of(2,4,6,8)
    }
}

factory.subscribe{ event in
    print("第一次订阅:",event)
}

factory.subscribe { event in
    print("第二次订阅:",event)
}

/// 打印结果:
第一次订阅: next(2)
第一次订阅: next(4)
第一次订阅: next(6)
第一次订阅: next(8)
第一次订阅: completed
第二次订阅: next(1)
第二次订阅: next(3)
第二次订阅: next(5)
第二次订阅: next(7)
第二次订阅: completed

12、interval()

创建一个Observable序列,每隔一段设定的时间,会发出一个索引的元素,而且它会一直发送下去

/// 创建一个每隔一秒钟就发出事件,并且在主线程执行
let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
observable.subscribe{ event in
    print(event)
}
.disposed(by: bag)

/// 打印结果:
/// next(0)
/// next(1)
/// next(2)
/// ...

13、timer()

(1)用法一:创建Observable序列在经过设定的一段时间后,产生唯一的一个元素

/// 延时定时器:2秒后发出事件
let observable = Observable<Int>.timer(.seconds(2), scheduler: MainScheduler.instance)
observable.subscribe{ event in
    print(event)
}
.disposed(by: bag)

(2)用法二:创建Observable序列在经过设定的一段时间后,每隔一段时间产生一个元素

/// 定时器:
/// 延时:0秒
/// 时间间隔:1秒
/// 执行线程: 主线程
let observable = Observable<Int>.timer(.seconds(0), period: .seconds(1), scheduler: MainScheduler.instance)
observable.subscribe{ event in
    print(event)
}
.disposed(by: bag)

相关文章

  • RxSwift_01_可观察序列

    首先理清以下几个概念(也是小编理解RxSwift的突破口)什么是观察者,什么是可被观察者 实现ObserverTy...

  • 可连接的操作

    可连接的可观察序列类似于普通观察到的序列,但他们不会开始在订阅以后发出事件,但是,只有当他们调用connect()...

  • 概率计算算法

    1.1 直接计算法 由于已知马尔可夫模型参数和观察序列,所以有 模型产生某一状态序列的概率 模型产生某一状态序列时...

  • RxSwfit 学习笔记(四)AsyncSubject、Publ

    在RxSwfit 学习笔记(二)Observable & Observer中,我们有聊到“既是可监听序列也是观察者...

  • RxSwift源码分析(一)序列核心逻辑

    RxSwift核心概念就是观察者(observer)订阅一个可观察者序列(Observable),观察者对数据序列...

  • 自然语言处理——6.3 HMM之 前向算法

    解决问题1:快速计算观察序列概率 给定模型和观察序列 ,快速计算: 1. 基本方法 对于给定的状态序列 ,? 困难...

  • RxSwift学习 - RxRelay

    RxRelay RxRelay 既是 可监听序列 也是 观察者。 他和 Subjects 相似,唯一的区别是不会接...

  • 1-RxSwift中基本概念和使用

    RxSwit中最重要的一个概念叫做Observable,我们可以把他翻译为序列、可观察序列等等 流、序列、可观察序...

  • RxSwift核心之辅助类型

    前言 框架里面定义了一些 辅助类型,它们既是 可监听序列( Observable )也是 观察者( Observe...

  • 连接操作符:connect、publish、replay、mul

    可连接的序列 可连接的序列(Connectable Observable):(1)可连接的序列和一般序列不同在于:...

网友评论

      本文标题:RxSwift_01_可观察序列

      本文链接:https://www.haomeiwen.com/subject/ldgbtltx.html