创建Observer
观察者
观察者作用就是监听事件, 然后对这个事件做出响应, 或者说任何响应时间的行为都是观察者
1. 在subscribe()方法中创建监听者
- 创建观察者最直接的方法就是在
Observable的subscribe()方法后面描述事件发生时, 需要如何做出响应
let observable1 = Observable.of("A", "B", "C", "D")
observable1.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}).disposed(by: bag)
2. 在bind()方法中创建
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.map { "索引: \($0)" }.bind { self.label.text = $0 }.disposed(by: bag)
3. 使用AnyObserver来创建观察者
- AnyObserver可以用来描述任意一种观察者
let observer3: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
let observable3 = Observable.of("A", "B", "C", "D")
observable3.subscribe(observer3).disposed(by: bag)
- 配合bindTo方法使用
let observer31: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let text):
self.label.text = text
default:
break
}
}
let observable31 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable31.map { "当前索引: \($0)" }.bind(to: observer31).disposed(by: bag)
4. 使用Binder创建观察者
- 相较于AnyObserver的大而全, Binder更专注于特定的场景. Binder主要有以下两个特征
- 特征1: 不会处理错误事件
- 特征2: 确保绑定都是在给定Schedule上执行(默认MainSchedule)
- 一旦发生错误事件, 在调试环境下将执行fatalError, 在发布环境下将打印错误信息
- 在上面序列数显示样例中, label标签的文字显示就是一个典型的UI观察者.他在响应事件时, 只会处理next事件, 而且更新UI的操作需要在主线程上执行. 那么这种情况更好的方案就是使用Binder
let observer4: Binder<String> = Binder(label) { (view, text) in
view.text = text
}
let observable4 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable4.map{ "索引显示: \($0)" }.bind(to: observer4).disposed(by: bag)
创建Observer的更多相关文章
- 观察者模式-Observer
观察者模式很好理解,简单来说就是:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系. 1. 自己手工创建Observer模式 首先,创建观察者接口: pub ...
- ZooKeeper(三):请求处理链路的创建过程解析
我们知道,zk就是一个个处理链组成的. 但是,这些处理链是在什么创建的呢? ZooKeeper 中有三种角色的服务节点存在: Leader, Follower, Observer . 而每个服务节点的 ...
- Laravel使用Observer(观察者)
1.创建observer文件,我这里是要记录仓库库存模块的操作日志,所以执行下面的语句,会在app/Observers下面创建WarehouseInventoryObserver文件. php a ...
- Android开发学习之路-Android中使用RxJava
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
- 我的runloop学习笔记
前言:公司项目终于忙的差不多了,最近比较闲,想起叶大说过的iOS面试三把刀,GCD.runtime.runloop,runtime之前已经总结过了,GCD在另一篇博客里也做了一些小总结,今天准备把ru ...
- 对rxandroid的简单理解
最近发现这个rxandroid挺火的,我就研究了一下,还真的挺不错. 首先在说之前可能很多人会和我刚刚学习的时候一样有很多疑问,如: 1:rxandroid是什么东西? 2:rxandroid能干嘛? ...
- [iOS]浅谈NSRunloop工作原理和相关应用
一. 认识NSRunloop 1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main ...
- 78. Android之 RxJava 详解
转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...
- iOS开发——多线程篇——RunLoop
一.简介 1.什么是RunLoop从字面意思看运行循环跑圈 基本作用保持程序的持续运行处理App中的各种事件(比如触摸事件.定时器事件.Selector事件)节省CPU资源,提高程序性能:该做事时做事 ...
随机推荐
- eclipse使用mybatis实现Java与xml文件相互跳转
原文:https://jingyan.baidu.com/article/8ebacdf0f06c8c09f65cd5a0.html 一直习惯使用eclipse,看见同事使用IDEA,直接从Java类 ...
- Flux 和 Mono 的区别
Flux 和 Mono 是 Reactor 中的两个基本概念.Flux 表示的是包含 0 到 N 个元素的异步序列.在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息.序列结束的消息和序列 ...
- Spring AOP中JoinPoint的用法
Spring JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的 ...
- C++编译器与链接器工作原理
http://blog.csdn.net/success041000/article/details/6714195 1. 几个概念 1)编译:把源文件中的源代码翻译成机器语言,保存到目标文件中.如果 ...
- [nodemon] app crashed - waiting for file changes before starting...
慕课网前端工程师晋升课程 Vue全家桶+SSR+Koa2全栈开发美团网 视频里用 npx create-nuxt-app mt-app创建项目后,不能使用import ...from....跟着老师修 ...
- Vsftpd 2.2.x安装和配置--centos7前的版本
Vsftpd 2.2.x安装和配置--centos7前的版本 原文链接:https://my.oschina.net/loubobooo/blog/1633367 1. 关闭防火墙和Selinux L ...
- 【JZOJ6213】【20190613】String
题目 \(n \le 10^{18} \ , \ |T| \le 10^5\) 题解 显然,最少的操作次数一定是贪心地能匹配就匹配 我们可以建出\(T\)的SAM,把SAM不能走的边补到根的后继节点 ...
- nginx 反向代理之 proxy_cache
proxy_cache将从C上获取到的数据根据预设规则存放到B上(内存+磁盘)留着备用,A请求B时,B会把缓存的这些数据直接给A,而不需要再去向C去获取. proxy_cache相关功能生效的前提是, ...
- 【POJ3278】Catch That Cow
本题传送门 本题知识点:宽度优先搜索 题意很简单,我们把FJ与奶牛看作是在一条数轴上的点,奶牛固定在K点,FJ的移动有三种,分别是向前一格,向后一格以及跳到当前格的两倍去.问FJ花费最少的时间到达奶牛 ...
- npm安装插件怎么判断是--save 还是--save--dev
npm敲到一半的时候发现:诶 这个到底是-g呢还是--save还是--save-dev呢 1.首先要先了解package.json 在Node.js中,模块是一个库或框架,也是一个Node.js项目. ...