创建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资源,提高程序性能:该做事时做事 ...
随机推荐
- spring-mvc.xml 和 application-context.xml的配置与深入理解
在java框架这个话题,前几篇文章是基于搭建ssm项目框架,以及web.xml的配置讲解,本篇主要就ssm框架的其他配置文件进行深入讲解,他们分别是:1.application-context.xml ...
- CSS float 父元素高度自适应
<html> <head><title></title><style type="text/css">*{margin: ...
- Css背景设置 、
每天进步一小步,一年进步一大步. 第一次发博客园文章,主要记录自己学习的一个过程. CSS3 背景 CSS3 包含多个新的背景属性,它们提供了对背景更强大的控制. background-size ba ...
- 将公式直接转化为Latex代码的神器-snip
经常用latex写论文,免不了要敲各种公式,今天和大家分享一个神器-snip,它可以直接将公式转化为代码,不需要我们自己编写公式代码,方便快捷,准确率极高.该神器的下载地址为:https://math ...
- 前端知识--mulline框架,返回到前一个页面,并且刷新前一个页面
最近在写项目的时候,遇到了这样一个问题,在第二页面修改完了数据之后,点击返回按钮的时候,第一个页面要返显出第一个页面的数据,这想想其实也不是很难,但是,难就难在,这两个页面是同时打开的.关闭了一个页面 ...
- python面试题&练习题之函数
1.写函数,接收两个数字参数,返回最大值例如:传入:10,20返回:20 def res_max(number1,number2): l1 = [] l1.append(number1) l1.app ...
- Is Safari on iOS 6 caching $.ajax results? post Cache
https://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results Since the upgra ...
- iOS GPU、cpu、显示器的协作
在 iOS 系统中,图像内容展示到屏幕的过程需要 CPU 和 GPU 共同参与. CPU 负责计算显示内容,比如视图的创建.布局计算.图片解码.文本绘制等. 随后 CPU 会将计算好的内容提交到 GP ...
- Oracle执行过程中出现的问题
ORA-02292: 违反完整约束条件 (用户名.约束名) - 已找到子记录 造成原因:删除该表时,有依赖该表的子表数据,需要删除该条记录或者禁用约束. 查看约束所在的表:select * from ...
- matlab基础向1-6:基础语法
1.软件中如何运行代码? 命令行直接写代码,回车执行,也可以在文件里编写代码,比如有文件hello.m,点击“Run”直接运行或者在命令行窗口里输入“hello+回车”运行. 2.清空命令行 clc+ ...