RxSwift笔记三组合序列

简介

git地址: https://github.com/ReactiveX/RxSwift
    参考资料:http://t.swift.gg/d/2-rxswift
    
    ReactiveX是通过可观察的流实现异步编程的一种API,它结合了观察者模式、迭代器模式和函数式编程的精华,RxSwift 是 ReactiveX 编程思想的一种实现。
复制代码

startWith

let subscription = Observable.of(4, 5, 6, 7, 8, 9)
    .startWith(3)
    .startWith(2)
    .subscribe {
        print($0)
}
///打印:2,3,4, 5, 6, 7, 8, 9
复制代码

combineLatest

当两个序列任意一个发送数据时,combineLatest会结合并整理每个序列发射的最近数据项。
复制代码

let intOb1 = PublishSubject<String>()
let intOb2 = PublishSubject<Int>()

_ = Observable.combineLatest(intOb1, intOb2) {
    "(\($0) \($1))"
    }
    .subscribe {
        print($0)
}

intOb1.on(.Next("A"))
intOb2.on(.Next(1))
intOb1.on(.Next("B"))
intOb2.on(.Next(2))

///输出:(A 1) (B 1) (B 2)
复制代码
  • 我们都要去传入 resultSelector 这个参数,一般我们做尾随闭包,这个是对两(多)个序列值的处理方式,上面的例子就是将序列一和二的值变成字符串,中间加个空格,外面再包一个() .
  • Rx 在 combineLatest 上的实现,只能结合 8 个序列。再多的话就要自己去拼接了。
let intOb1 = Observable.just(2)
let intOb2 = ReplaySubject<Int>.create(bufferSize: 1)
intOb2.onNext(0)
let intOb3 = Observable.of(0, 1, 2, 3, 4)
intOb2.onNext(1)
    
_ = Observable.combineLatest(intOb1, intOb2, intOb3) {
    "\($0) \($1) \($2)"
    }
    .subscribe {
        print($0)
}
intOb2.onNext(2)
intOb2.onNext(3)

///输出: "210","211","212","213","214","224","234"
复制代码
let intOb1 = Observable.just(2)
let intOb2 = Observable.of(0, 1, 2, 3)
let intOb3 = Observable.of(0, 1, 2, 3, 4)

_ = [intOb1, intOb2, intOb3].combineLatest { intArray -> Int in
    Int((intArray[0] + intArray[1]) * intArray[2])
    }
    .subscribe { (event: Event<Int>) -> Void in
        print(event)
    }
    
    next(2)
    next(2)
    next(3)
    next(4)
    next(6)
    next(8)
    next(11)
    next(14)
    completed
复制代码

zip

zip 与 combineLatest 的区别是每当所有序列都发射一个值时, zip 才会发送一个值。它会等待每一个序列发射值,发射次数由最短序列决定。结合的值都是一一对应的。

let intOb1 = Observable.of(0, 1)
let intOb2 = Observable.of(0, 1, 2, 3)
let intOb3 = Observable.of(0, 1, 2, 3, 4)

_ = Observable.zip(intOb1, intOb2, intOb3) {
    ($0 + $1) * $2
    }
    .subscribe {
        print($0)
    }
复制代码

merge

merge是将多个序列合并成一个序列,序列发送的数据按照先后顺序合并,merge合并的是序列,也就是说序列发送序列才能使用merge.
复制代码

let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()

_ = Observable.of(subject1, subject2)
    .merge(maxConcurrent: 2)
    .subscribe {
        print($0)
}
subject1.on(.Next(20))
subject1.on(.Next(40))
subject1.on(.Next(60))
subject2.on(.Next(1))
subject1.on(.Next(80))
subject1.on(.Next(100))
subject2.on(.Next(1))
复制代码

switchLatest

switchLatest 和 merge 有一点相似,都是用来合并序列的。然而这个合并并非真的是合并序列。事实是每当发射一个新的序列时,丢弃上一个发射的序列.
复制代码

let var1 = Variable(0)
    
let var2 = Variable(200)
    
// var3 是一个 Observable<Observable<Int>>
let var3 = Variable(var1.asObservable())
    
let d = var3
    .asObservable()
    .switchLatest()
    .subscribe {
        print($0)
    }

var1.value = 1
var1.value = 2
var1.value = 3
var1.value = 4

var3.value = var2.asObservable() // 我们在这里新发射了一个序列
    
var2.value = 201
    
var1.value = 5 // var1 发射的值都会被忽略
var1.value = 6
var1.value = 7
复制代码

转载于:https://juejin.im/post/5ab0b97a6fb9a028d3753bec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值