本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 —— 4.在 Combine 中使用通知

 

内容概览

  • 前言
  • 让通知处理代码使用 Combine
  • 总结

 

前言

 

通知中心是苹果开发者常用的功能,很多框架都会使用通知中心来向外部发送异步事件。对于iOS开发人员而言,以下代码一定非常眼熟:

var notificationToken: NSObjectProtocol?

override func viewDidLoad() {
super.viewDidLoad() notificationToken = NotificationCenter.default
.addObserver(forName: UIDevice.orientationDidChangeNotification,
object: nil,
queue: nil) { _ in
if UIDevice.current.orientation == .portrait {
print ("Orientation changed to portrait.")
}
}
}

现在,让我们来学习如何使用 Combine 处理通知,并将已有的通知处理代码迁移到 Combine

 

让通知处理代码使用 Combine

 

使用通知中心回调和闭包要求您在回调方法或闭包内完成所有工作。通过迁移到 Combine,您可以使用操作符来执行常见的任务,如:filter

想充分利用 Combine,请使用 NotificationCenter.Publisher 将您的 NSNotification 处理代码迁移到 Combine 习惯用法。您可以使用 NotificationCenter 方法 publisher(for:object:) 创建发布者,并传入您感兴趣的通知名称和可选的源对象。

var cancellable: Cancellable?

override func viewDidLoad() {
super.viewDidLoad() cancellable = NotificationCenter.default
.publisher(for: UIDevice.orientationDidChangeNotification)
.filter() { _ in UIDevice.current.orientation == .portrait }
.sink() { _ in print ("Orientation changed to portrait.") }
}

如上面的代码所示,在 Combine 中重写了最上面的代码。此代码使用了默认的通知中心来为orientationDidChangeNotification 通知创建发布者。当代码从该发布者接收到通知时,它使用过滤器操作符 filter(_:) 来实现只处理纵向屏幕通知的需求,然后打印一条消息。

需要注意的是,orientationDidChangeNotification 通知的 userInfo 字典中不包含新的屏幕方向,因此 filter(_:) 操作符直接查询了 UIDevice

 

总结

 

虽然上面的示例无法突显 Combine 的优势,但是我们可以自行想象。使用 Combine 之后,如果需求变得很复杂,我们要做的可能只是增加操作符而已,而且不破坏链式调用代码的易读性。

朋友,行动起来吧!把现有项目中的旧代码重构成使用 Combine 的代码~

 

本文内容来源:

Routing Notifications to Combine Subscribers

 

Combine 框架,从0到1 —— 4.在 Combine 中使用通知的更多相关文章

  1. Combine 框架,从0到1 —— 1.核心概念

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 1.核心概念.     内容概览 前言 核心概念 RxSwift Combine 总结 参考内容 ...

  2. Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 2.通过 ConnectablePublisher 控制何时发布.   内容概览 前言 使用 ma ...

  3. Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 3.使用 Subscriber 控制发布速度.   内容概览 前言 在发布者生产元素时消耗它们 使 ...

  4. Combine 框架,从0到1 —— 4.在 Combine 中使用计时器

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用计时器. 内容概览 前言 使用计时器执行周期性的工作 将计时器转换为计时 ...

  5. Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用 KVO.   内容概览 前言 用 KVO 监控改动 将 KVO 代 ...

  6. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...

  7. Combine 框架,从0到1 —— 5.Combine 提供的发布者(Publishers)

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 提供的发布者(Publishers). 内容概览 前言 Just Future D ...

  8. Combine 框架,从0到1 —— 5.Combine 中的 Subjects

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 中的 Subjects. 内容概览 前言 PassthroughSubject C ...

  9. Combine 框架,从0到1 —— 5.Combine 常用操作符

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 常用操作符. 内容概览 前言 print breakpoint handleEve ...

随机推荐

  1. Axios源码分析

    Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中. 文档地址:https://github.com/axios/axios axios理解和使用 1.请求配置 { // ...

  2. [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做

    PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做 今天自己实现PCA,从网上看文章的时候,发现有的文章没有搞清楚把SVD(奇异值分解)实现和EVD(特征值分解) ...

  3. 你真的理解索引吗?从数据结构层面解析mysql索引原理

    从<mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构>中,我们已经知道了数据页内各个记录是按主键正序排列并组成了一个单向链表的,并且各个数据页之间形成了双向链表.在数据页 ...

  4. C#LeetCode刷题之#59-螺旋矩阵 II(Spiral Matrix II)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3678 访问. 给定一个正整数 n,生成一 ...

  5. C#LeetCode刷题-并查集

    并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列   39.3% 困难 130 被围绕的区域   30.5% 中等 200 岛屿的个数   38.4% 中等 547 朋友圈   45.1% ...

  6. C#LeetCode刷题之#581-最短无序连续子数组( Shortest Unsorted Continuous Subarray)

    问题 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 输入: [2, 6, 4, 8, 10, ...

  7. centos go 安装 使用

    #goland 确保能ping通百度[root@z my_project]# vi /etc/resolv.conf# Generated by NetworkManagersearch locald ...

  8. C++指针变量的基本写法

    指针变量与应用——动态数组 在C++中,有一种神奇的变量,它不可以表示一个值,但是可以表示某个元素的地址,通过地址来访问这个元素. 打个比方:你有一张地图和一个坐标,你就可以通过访问这个坐标来达到你访 ...

  9. 第一章 Kubernetes入门

    第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...

  10. python 3.7 jupyter中安装 docx报错

    from docx import Document报错: Import Error: No module named ‘exceptions‘ 解决办法: 使用下面的命令重新安装docx !pip i ...