Swift中发布-订阅框架Combine的使用
Combine核心概念
let stringPublisher = Just("hello, world!")
let uppercasedPublisher = stringPublisher.map { $0.uppercased() }
let arrayPublisher = [1, 2, 3, 4, 5].publisher
let oddPublisher = arrayPublisher.filter { $0 % 2 != 0 }
let publisher1 = Just("hello")
let publisher2 = Just("world")
let mergedPublisher = Publishers.Merge(publisher1, publisher2)
import UIKit
import Combine class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! var cancellables = Set<AnyCancellable>() override func viewDidLoad() {
super.viewDidLoad() // 创建一个订阅者,打印出文本输入的内容
let subscriber = Subscribers.Assign(object: self.textField, keyPath: \.text) // 订阅文本输入框的文本变化事件
self.textField.textPublisher(for: .editingChanged)
.map { $0.text ?? "" }
.subscribe(subscriber)
.store(in: &cancellables)
}
} extension UITextField {
func textPublisher() -> AnyPublisher<String, Never>
{
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: self)
.map {($0.object as? UITextField)?.text ?? ""}
.eraseToAnyPublisher()
}
}
import Combine
let subject = PassthroughSubject<String, Never>() // 创建PassthroughSubject
// 订阅
let subscription = subject.sink(receiveCompletion: { _ in
print("receiveCompletion")
}, receiveValue: { value in
print(value) })
// 发送数据
subject.send("hello")
// 中途取消订阅
subscription.cancel()
// 后面发送的数据都会失败
subject.send("world")
subject.send(completion: .finished)
/* 输出:
hello
*/
import UIKit
import Combine
let dataPublisher = URLSession.shared.dataTaskPublisher(for: URL(string: "https://louyu.cc")!)
let cancellableSink = dataPublisher.sink { completion in
switch completion {
case .finished:
break
case .failure(let error):
print("error: \(error)")
break
}
} receiveValue: { value in
print("received \(value)")
}
cancellableSink.cancel() //取消网络请求
Swift中发布-订阅框架Combine的使用的更多相关文章
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...
- 基于.NET Socket Tcp的发布-订阅框架
基于.NET Socket Tcp的发布-订阅框架 一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已 ...
- react 中发布订阅模式使用
react 中发布订阅模式使用 场景 怎么能将设计模式应用到我们的 React 项目中?以前一直在思考这个问题. 场景一 模块 A 模块 B 需要用到同一个数据 data,A 和 B 都会修改这份数据 ...
- 理解JavaScript设计模式与开发应用中发布-订阅模式的最终版代码
最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线 ...
- python中发布订阅和主从配置
发布订阅 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的 ...
- java 多线程 发布订阅模式:发布者java.util.concurrent.SubmissionPublisher;订阅者java.util.concurrent.Flow.Subscriber
1,什么是发布订阅模式? 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话 ...
- kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统
一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...
- Springboot+Redis(发布订阅模式)跨多服务器实战
一:redis中发布订阅功能(http://www.redis.cn/commands.html#pubsub) PSUBSCRIBE pattern [pattern -]:订阅一个或者多个符合pa ...
- Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua
开心一刻 我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门 昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:"看咱前面,想不到这么丑都有人要." 女朋友 ...
随机推荐
- 函数计算 FC 3.0 发布,全面降价,最高幅度达93%,阶梯计费越用越便宜
作为国内最早布局 Serverless 的云厂商之一,阿里云在 2017 年推出函数计算 FC,开发者只需编写代码并上传,函数计算就会自动准备好相应的计算资源,大幅简化开发运维过程.阿里云函数计算持续 ...
- 大四上 | 计算机综合课设(OS)· 答辩经验帖
课设代码 repo 被问了如下问题: 我们的 OS 中是否有 idle 进程. 背景:如果所有进程都被 kill 掉了,那么 os 就会陷入死循环.即使再发生需要响应的事情,比如希望再创建个进程 或者 ...
- Java 客户端访问kafka
本文为博主原创,未经允许不得转载: 1. 引入maven依赖 <dependency> <groupId>org.apache.kafka</groupId> &l ...
- Angular系列教程之自定义指令
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- NewStarCTF 2023 公开赛道 WEEK4|CRYPTO WP
RSA Variation II 1.题目信息 提示:"Schmidt Samoa" 附件信息 from secret import flag from Crypto.Util.n ...
- [转帖]History of Unicode Release and Publication Dates
www.unicode.org For ease of reference, this page collects together information about the dates for v ...
- [转帖]什么是内存屏障? Why Memory Barriers ?
要了解如何使用memory barrier,最好的方法是明白它为什么存在.CPU硬件设计为了提高指令的执行速度,增设了两个缓冲区(store buffer, invalidate queue).这个两 ...
- [转帖]PostgreSQL中的schema和user
https://www.cnblogs.com/abclife/p/13905336.html postgresql中,用户创建的所有对象都被创建在指定的schema(或namespace)中.其他用 ...
- [转帖]Guanaco, Llama, Vicuña, Alpaca该怎么区别
https://zhuanlan.zhihu.com/p/106262896 在智利和秘鲁高原区经常会遇到的一种动物让人十分挠头,学术点称呼就是骆驼科其中一个族群--羊驼属和骆马属.头疼在于,分不清楚 ...
- nr_requests 以及 queue_depth的学习与了解
nr_requests 以及 queue_depth的学习与了解 背景 冯诺依曼的计算机体系结果里面 运算器,存储器是核心. 但是将核心的产生的结果推送出去的其实是IO IO虽然不是像运算器和存储器那 ...