相关文章推荐
霸气的铅笔  ·  Azure Queue storage ...·  1 年前    · 
不拘小节的紫菜汤  ·  Module not found: ...·  1 年前    · 
乐观的甜瓜  ·  Introducing the ...·  2 年前    · 
悲伤的熊猫  ·  python - IP ...·  2 年前    · 

将序列每个元素转换一遍,适合于序列内的元素类型改变,比如Bool转换为String, 或者其他值的操作。
输入类型, 输出还是类型

flapMap

将序列的元素转换为其他序列, 就很适合a序列转换为b序列,比如
输入类型/序列, 输出 序列

flapMapLatest

和flapMap相似,不同的是只发出最新元素

Error 序列中断

一旦序列产生一个error,整个序列将被 终止 ,后续监听也就监听不了,也包括序列转换
Error Handling 错误事件处理

实例代码:

private func createObservable() {
        let subject = PublishSubject<Void>()
        /// 使用flatMap转换为其他序列
        let otherOb =  subject.asObservable()
            .flatMapLatest({_ -> Observable<String> in
                print("flatMap")
                return self.netRequest()
        // 发出一次next, 由于没有订阅,所以没有效
        subject.onNext(())
        // 订阅
        subject.subscribe(onNext: { (_) in
            print("发出一次事件")})
            .disposed(by: disposeBag)
        // 又发出一次事件
        subject.onNext(())
        // 订阅otherOb, 之后发出的事件都可以监听,除非序列发出Error事件
        otherOb.subscribe(onNext: { (value) in
            print("otherSub subscribe")
            print(value)})
            .disposed(by: disposeBag)
        // subject 发出两次事件
        subject.onNext(()) // [1]如果在netRequet方法中抛出Error, 就会引起序列终止,下面一个发出事件也就无效。
        subject.onNext(())
    // 模拟网络请求
    private func netRequest() -> Observable<String> {
       return Observable<String>.create { (observer) -> Disposable in
        observer.onError(NSError(domain: "www.baidu.com", code: 30, userInfo: [:]))
//            observer.onNext("你好")
//            observer.onCompleted()
            return Disposables.create()

运行日志打印

发出一次事件
发出一次事件
flatMap
Unhandled error happened: Error Domain=www.baidu.com Code=30 "(null)"
 subscription called from:
发出一次事件
发出一次事件

可以看到,如果网络请求抛出error [1]之后的下一次next将不会转换,同理转换出来的序列也会中断。
如果不发出Error只发出next和complete

   // 模拟网络请求
    private func netRequest() -> Observable<String> {
       return Observable<String>.create { (observer) -> Disposable in
            observer.onNext("你好")
            observer.onCompleted()
            return Disposables.create()
发出一次事件
发出一次事件
flatMap
otherSub subscribe
发出一次事件
flatMap
otherSub subscribe

可以看到,序列没有中断,对应的转换也没有中断。
总之
不要轻易发出Error事件,考虑到会不会终止序列和转换。如果需要错误提示,采用Result也许更好。

RxSwift序列转换map将序列每个元素转换一遍,适合于序列内的元素类型改变,比如Bool转换为String, 或者其他值的操作。输入类型, 输出还是类型flapMap将序列的元素转换为其他序列, 就很适合a序列转换为b序列,比如输入类型/序列, 输出序列flapMapLatest和flapMap相似,不同的是只发出最新元素Error 序列中断一旦序列产生一个error,整个... onerror事件用来协助处理页面的JavaScript错误。当页面上出现异常时,error事件便在window对象上触发。例如:      在这种情况下,浏览器会显示错误信息: 如果不希望浏览器在默认对话框显示出错消息,让onerror方法返回true即可。 此外,onerror方法还提供了三个参数用来确定错误确切的信息,分别是: 1)message:一个字符串,声明了出现的错误的信息(不同的浏览器返回的消息内容略有差异)。 2)url:一个字符串,声明了出现错误的文档的URL。 3)line:一个数字,声明了出现错误的代码行的行号。
前言RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发,维护。RxSwift的目的是让让数据/事件流和异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程目前,RxSwift在Github上收到了5000+Star,600+fork。本文的目的 介绍RxSwift的核心思想 讲解RxSwift的基础使用 介绍RxSwift的优点 如果你有时间
在这篇文章我会对map,flatMapflatMapLatest三个操作符进行比较,下面我们来举个例子。 let stream = Observable.interval(1000).take(10); return stream.map(n => n * 2); 上面的代码模拟了异步行为,每隔1s发射一个数字。这个例子很简单,...
let publishSubject = PublishSubject<String>() //buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。 //该方法简单来说就是缓存 Observable 发出的新元素,当元素达到某个数量,或者经过了特定的时间,它就会...
RxSwift学习(一)— RxSwift介绍 RxSwift学习(二)— Observable 常见的序列创建方法 RxSwift学习(三)— RxSwift 高阶函数 RxSwift 高阶函数 今天我们来探索下RxSwift高阶函数,和一些组合函数的用法 组合操作符 startWith() 在开始从可观察源发出元素之前,发出指定的元素序列 elements:要附加到指定序列的元素 returns: 返回以指定值开头的源序列 public func startWith(_ elements:..
如何处理RxSwiftError事件 翻译自:How to handle errors in RxSwift 在最近这些日子里,MVVM在iOS开发变得越来约受欢迎,RxSwfit也变得越来越流行。在RxSwift大多数属性都是序列(Observable)。 但是,当遇到error或者completed时,序列就会终止。 终止代表者序列订阅将不会接收到任何信息,当我刚开始学习Rx的时候,我并...
先上代码吧: self.signedIn = input.loginTaps.withLatestFrom(usernameAndPassword) .flatMapLatest { (username, password) in return EmeAPI.sharedInstance.request(UserApi.login(loginName: usernam WithLatestFrom.swift: Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any. Throttle.swift: Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration. This operator...
最近项目有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeLine,Image ) C.对用户信息进行设置(POST方,参数为 timeLine, avatarURL, userId) 对这个情景简单分析,不难得出一个结论,B依赖于A的...
public void DemoStream() { String stringGather[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; System.out.println ReactiveX: transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable 将一个可观察序列的所有元素映射成为另一个可观察序列。 Observable&amp;lt;I...