一、系统通知的注册与响应

① 监听应用进入后台的通知

  • 现有如下需求:程序编译运行后,当按下设备的 home 键,程序进入后台的同时会在控制台中输出相关信息。
  • 程序进入后台时除了会执行 AppDelegate.swift 里的 applicationDidEnterBackground 方法外,还会发送 UIApplicationDidEnterBackground 通知,这里可以使用 NotificationCenter 的 Rx 扩展方法来监听这个通知。
  • 关于 .takeUntil(self.rx.deallocated):它的作用是保证页面销毁的时候自动移除通知注册,避免内存浪费或出现奔溃。
// 监听应用进入后台通知
_ = NotificationCenter.default.rx.notification(NSNotification.Name.UIApplicationDidEnterBackground).takeUntil(self.rx.deallocated)  // 页面销毁自动移除通知监听.subscribe(onNext: { _ inprint("程序进入到后台")})
  • 运行结果:
程序进入到后台

② 监听键盘的通知

  • 分别监听虚拟键盘的打开和关闭通知,并在控制台中输出相关信息:
// 添加文本输入框
let textField = UITextField(frame: CGRect(x:20, y:100, width:200, height:30))
textField.borderStyle = .roundedRect
textField.returnKeyType = .done
self.view.addSubview(textField)// 点击键盘上的完成按钮后,收起键盘
textField.rx.controlEvent(.editingDidEndOnExit).subscribe(onNext: {  _ in// 收起键盘textField.resignFirstResponder()}).disposed(by: disposeBag)// 监听键盘弹出通知
_ = NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillShow).takeUntil(self.rx.deallocated) // 页面销毁自动移除通知监听.subscribe(onNext: { _ inprint("键盘出现")})// 监听键盘隐藏通知
_ = NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillHide).takeUntil(self.rx.deallocated) // 页面销毁自动移除通知监听.subscribe(onNext: { _ inprint("键盘消失")})

二、自定义通知的发送与接收

  • 定义一个 MyObserver.swift(观察者在收到通知后的执行的处理函数中,添加了个 3 秒的等待),如下:
class MyObserver: NSObject {var name:String = ""init(name:String){super.init()self.name = name// 接收通知:let notificationName = Notification.Name(rawValue: "DownloadImageNotification")_ = NotificationCenter.default.rx.notification(notificationName).takeUntil(self.rx.deallocated) // 页面销毁自动移除通知监听.subscribe(onNext: { notification in// 获取通知数据let userInfo = notification.userInfo as! [String: AnyObject]let value1 = userInfo["value1"] as! Stringlet value2 = userInfo["value2"] as! Intprint("\(name) 获取到通知,用户数据是[\(value1),\(value2)]")// 等待3秒sleep(3)print("\(name) 执行完毕")})}
}
  • 发出一个携带有自定义数据的通知,同时创建两个观察者来接收这个通知:
let observers = [MyObserver(name: "观察器1"),MyObserver(name: "观察器2")]print("发送通知")
let notificationName = Notification.Name(rawValue: "DownloadImageNotification")
NotificationCenter.default.post(name: notificationName, object: self,userInfo: ["value1":"Kody", "value2" : 123])
print("通知完毕")
  • 运行结果如下,可以看出,通知发送后的执行是同步的,也就是说观察者全部处理完毕后,主线程才继续往下进行:
发送通知
观察器1 获取到通知,用户数据是[Kody,123]
观察器1 执行完毕
观察器2 获取到通知,用户数据是[Kody,123]
观察器2 执行完毕
通知完毕

RxSwift之NotificationCenter的使用和自定义相关推荐

  1. 翻译:RxSwift的历史以及概念详细解析

    说明 RxSwift到底是什么?这是一个很好的定义: RxSwift是一个库,用于通过使用可观察的序列和功能样式运算符来组成基于异步和基于事件的代码,从而允许通过调度程序进行参数化执行. 听起来复杂吗 ...

  2. 开源项目分析(SwiftHub)Rxswift + MVVM + Moya 架构分析(一)第三方框架使用

    文章目录 开源项目分析(SwiftHub)Rxswift + MVVM + Moya 架构分析(一)第三方框架使用 1. SwiftHub项目简介 1.1 SwiftHub项目UI 1.2 Swift ...

  3. NotificationCenter

    -通知中心 对于很多初学者往往会把iOS中的本地通知.推送通知和iOS通知中心的概念弄混.其实二者之间并没有任何关系,事实上它们都不属于一个框架,前者属于UIKit框架,后者属于Foundation框 ...

  4. RxSwift 案例学习(一)

    本文是官方案例GitHubSignup-UsingDriver学习笔记 项目实现功能 这个登录页面实现了下面几个功能: 1.检验用户名是否可用 2.密码是否符合要求 3.确认密码是符合密码一样 4.上 ...

  5. 【RxSwift 实践系列 2/3】thinking in Rx- Create和Drive

    ---> 上节 [RxSwift 实践系列 1/3]为什么使用RxSwift RxSwift 是一种编程思想,不是一门语言,学习他最难的部分就是thinking in Reactive Prog ...

  6. RxSwift UI控件扩展

    RxSwift UI控件扩展 最好的示例是参考RxCocoa查看类似的属性如何扩展Rx化的. 为了配合RxSwift的绑定关系,RxCocoa提供简单的基于Cocoa控件的扩展,但是很少,比如Labe ...

  7. RxSwift ViewModel定义

    RxSwift ViewModel定义 观察者模式 观察者模式目标:定义对象间一对多的依赖关系,当一个对象(被观察者)状态发生改变时,所有依赖于它的对象(观察者)都得到通知并被自动更新. 对于RxSw ...

  8. ios nslinkattributename 自定义url_iOS音视频播放指南(二)

    没看第一篇的小伙伴可以先看第一篇 wlzz:iOS音视频播放指南(一)​zhuanlan.zhihu.com 本章主要内容 画中画支持 后台音频播放,锁屏界面显示,远程音频控制 在耳机插拔.接听电话等 ...

  9. RxSwift之深入解析URLSession的数据请求和数据处理

    一.请求网络数据 ① 通过 rx.response 请求数据 如下所示,通过豆瓣提供的音乐频道列表接口获取数据,并将返回结果输出到控制台中: "https://www.douban.com/ ...

最新文章

  1. Java学习总结:4
  2. .Net 中 获取当前应用程序启动目录的几个方法和Path.Combine 细节
  3. boost::graph模块实现在无向图上使用连通分量算法
  4. JAVA 对象分配过程
  5. mysql-mmm 集群高可用软件介绍
  6. 2018/12/18 Mac 版 VMWare配置VMNet8 成功版
  7. 最通俗易懂的理解API和SDK
  8. vue的一些基本指令,搭建、编译、运行、打包
  9. 哈尔滨冰景:映衬时代主题
  10. 免费下载IEEE,SCI论文
  11. html 上下左右箭头按钮,css 上下左右箭头
  12. 看完了 2021 CSS 年度报告,我学到了啥?
  13. matlab 自定义对象,面向对象: MATLAB 的自定义类 [MATLAB]
  14. SQL根据身份证,统计用户的省份
  15. 【AD16】PCB过孔盖油
  16. class函数 python_python中class函数如何使用
  17. 基于enc28j60的学习心得
  18. 正交最小二乘法求解NARMAX
  19. gogs 服务开机自启动
  20. css零到一基础教程044:CSS 图标

热门文章

  1. 学习Knowledge Graph Embedding Based Question Answering代码笔记
  2. 读《三体Ⅱ · 黑暗森林》| 人能相互理解的前提是力量对等
  3. selenium 文件上传
  4. win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)
  5. php四种基础排序算法的运行时间比较
  6. 前后端分离+本地服务实时刷新+缓存管理+接口proxy+静态资源增量更新+各种性能优化+上线运维发布——gulp工作流搭建...
  7. Windows Azure 安全最佳实践 - 第 1 部分:深度解析挑战防御对策
  8. 设计一个简单的缓存容器
  9. wgn和awgn函数
  10. final在java中的含义_在java中一个类被声明为final类型,表示的意思是()