RxSwift和Combine的相同点和使用例子_combine swift 响应式编程-程序员宅基地

技术标签: RxSwift  rxswift  Combine  ios  swift  

RxSwift 和 Combine 都是响应式编程框架,用于简化异步和基于事件的代码。它们有很多相似之处,主要体现在设计理念和编程模式上。以下是 RxSwift 和 Combine 的主要相同点,以及它们的应用场景:

相同点

  • 1.响应式编程:两者都实现了响应式编程的概念,允许开发者处理异步事件的序列。
  • 2.基于观察者模式:它们使用观察者模式来订阅和响应数据流或事件。
  • 3.操作符:RxSwift 和 Combine 都提供了一系列的操作符,用于执行如过滤、映射、合并等操作。
  • 4.链式调用:支持通过链式调用来组合多个操作符,使代码更加简洁易读。
  • 5.处理异步操作:都被用于处理异步操作,如网络请求、用户输入等。
  • 6.内存管理:需要特别注意内存管理,避免循环引用。RxSwift 使用 DisposeBag,而 Combine 使用 AnyCancellable
  • 7.数据绑定:允许将数据绑定到UI元素,以响应状态变化。

应用场景

  • 1.网络请求和响应处理
    处理异步的网络请求,例如通过API获取数据。
    组合多个网络请求,处理并发和依赖关系。

  • 2.用户界面交互
    响应用户输入,如文本输入、按钮点击等。
    根据用户交互动态更新UI。

  • 3.状态管理
    管理和响应应用内部状态的变化。
    在不同组件或层之间同步状态。

  • 4.数据流转换和组合
    对数据流进行转换、过滤、合并等操作。
    从多个数据源组合数据。

  • 5.错误处理
    优雅地处理异步操作中的错误。
    通过重试、捕获等机制管理错误。

  • 6.功能模块解耦
    将业务逻辑与UI解耦,提高代码的可维护性。
    使得功能模块之间的通信更加灵活。

  • 7.动画和时间驱动的任务
    处理复杂的动画和基于时间的操作。
    管理定时任务和重复事件。

选择使用 RxSwift 还是 Combine 主要取决于目标平台和项目需求。RxSwift 适用于需要支持 iOS 10 及以下版本或者希望在多个平台(如 Android)共享代码逻辑的项目。Combine 更适合仅针对 iOS 13 及以上版本的项目,尤其是那些已经采用 SwiftUI 的应用程序。


使用例子: UIInputText的输入变化

使用Combine监听UIInputText的文字输入变化

import Combine
import UIKit

class MyViewController: UIViewController {
    
    @Published var text = ""
    var cancellable: AnyCancellable?

    override func viewDidLoad() {
    
        super.viewDidLoad()
        let textField = UITextField()
        self.view.addSubview(textField)

        cancellable = $text
            .sink {
     updatedText in
                print(updatedText)
            }

        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
    }

    @objc func textFieldDidChange(_ textField: UITextField) {
    
        text = textField.text ?? ""
    }
}

使用RxSwift监听UIInputText的文字输入变化

import RxSwift
import RxCocoa
import UIKit

class MyViewController: UIViewController {
    
    var disposeBag = DisposeBag()

    override func viewDidLoad() {
    
        super.viewDidLoad()
        let textField = UITextField()
        self.view.addSubview(textField)

        textField.rx.text
            .orEmpty
            .subscribe(onNext: {
     text in
                print(text)
            })
            .disposed(by: disposeBag)
    }
}

使用例子: 键盘高度的变化-隐藏与显示

使用Combine框架监听键盘高度变化

import Combine
import UIKit

class MyViewController: UIViewController {
    
    var cancellables = Set<AnyCancellable>()

    override func viewDidLoad() {
    
        super.viewDidLoad()

        NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
            .compactMap {
     notification in
                (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height
            }
            .sink {
     keyboardHeight in
                // 更新UI或布局
                print("键盘高度: \(keyboardHeight)")
            }
            .store(in: &cancellables)

        NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
            .sink {
     _ in
                // 键盘隐藏,更新UI或布局
                print("键盘隐藏")
            }
            .store(in: &cancellables)
    }
}

使用RxSwift框架监听键盘高度变化

import RxSwift
import RxCocoa
import UIKit

class MyViewController: UIViewController {
    
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
    
        super.viewDidLoad()

        NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
            .compactMap {
     notification in
                (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height
            }
            .subscribe(onNext: {
     keyboardHeight in
                // 更新UI或布局
                print("键盘高度: \(keyboardHeight)")
            })
            .disposed(by: disposeBag)

        NotificationCenter.default.rx.notification(UIResponder.keyboardWillHideNotification)
            .subscribe(onNext: {
     _ in
                // 键盘隐藏,更新UI或布局
                print("键盘隐藏")
            })
            .disposed(by: disposeBag)
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013538542/article/details/134426757

智能推荐

接入腾讯云apass数智人[交互式]_腾讯云智能数智人开发对接-程序员宅基地

文章浏览阅读291次。1、多个播报指令播报时,需要监听该会话下播报【结束】的状态再发送,否则播报指令将可能出现丢失,数智人只播报最新的一条指令。调用【新建视频流会话接口】获取[sessionId]会话唯一标识,[PlayStreamAddr]播放地址。2、播放流采用rtmp协议时,视频会存在3s左右的延迟,请妥善处理播报监听状态,以及数智人结束时的操作时机。,第三步:建立会话长链接(websocket)-监听数智人播报内容,以及播报状态。第五步:关闭会话-数智人停止播放。第四步:发送指令-进行播报。_腾讯云智能数智人开发对接

2022.8.9考试立方和--1100题解_给定一个正整数x。 检查数字x是否可以表示为两个正整数的立方和-程序员宅基地

文章浏览阅读380次。给出一个正整数 ,请判断 是否可以被表示为两个正整数的立方之和。用map去存立方数,枚举第一个数,在通过map证明第二个数的存在。接下来有 组测试数据,每组仅一行一个正整数 ( )。第一行仅有一个正整数 ( ),表示测试数据的组数。若 能被表示为两个正整数的立方之和,输出;注意开longlong。2、立方和–1100。..._给定一个正整数x。 检查数字x是否可以表示为两个正整数的立方和

第4章 化学反应与迁移-程序员宅基地

文章浏览阅读451次。4.1 引言4.2 平衡吸附4.2.1 吸附等温线及迁移方程中的吸附项4.2.2 有机化合物的吸附4.2.3 离子交换4.3 吸附动力学4.4 一级不可逆反应4.5 莫诺动力学反应4.6 多组分动力学反应4.7 双域系统中的化学反应

网页数据解析_本关任务:在 xpath 基础实训中,介绍了 xpath 的基础知识,本关需要使用 xpath 技术-程序员宅基地

文章浏览阅读3.1k次。第1关:XPath解析网页本关任务:在 XPath 基础实训中,介绍了 XPath 的基础知识,本关需要使用 XPath 技术来编写解析网页的程序。import urllib.requestfrom lxml import etreedef get_data(url): ''' :param url: 请求地址 :return: None ''' response=urllib.request.urlopen(url=url) _本关任务:在 xpath 基础实训中,介绍了 xpath 的基础知识,本关需要使用 xpath 技术

鸿蒙Harmony 拖动监听DraggedListener_鸿蒙 监听扫码枪-程序员宅基地

文章浏览阅读643次,点赞2次,收藏2次。鸿蒙Harmony 拖动监听DraggedListener效果图源码地址https://gitee.com/liukerui/harmony-app-examples.git_鸿蒙 监听扫码枪

ofbiz初级教程_ofbiz 教程-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏25次。本教程是ofbiz基本应用,它涵盖了OFBiz应用程序开发过程的基本原理。目标是使开发人员熟悉最佳实践,编码惯例,基本控制流程以及开发人员对OFBiz定制所需的所有其他方面。 本教程将帮助您在OFBiz中构建您的第一个“演示应用程序”。· 概述(OFBiz简介)· 设置和运行OFBiz· 下载Apache OFBiz_ofbiz 教程

随便推点

徐辉 北大计算机,徐辉的痛苦回忆_徐辉经历的那一段痛苦回忆-程序员宅基地

文章浏览阅读1.4k次。天空的蟾月已经西斜,渐渐星稀,东方的天际已经泛红,霞蔚铺开,舒展的云朵悄然飘来。嗡嗡嗡......是破山寺的钟声隐隐传来,一波一波的梵音经颂,几多心灵撼动,净里的天籁之音。犹记得尚湖的丝藕、那么的清脆,山麓上一树树挂着的一颗颗如红玛瑙枣仁的甜,毛栗子那么多刺,你会剥开的吃吗。家里的小院两棵橘树该挂满了如照着的红红的灯笼!耳畔阵阵唳唳的啭音传来,报着秋爽、韵着秋声,抬头望,长空里一字的雁行、点、点、..._徐辉的痛苦回忆

linux安装python3.7_python3.7 安装 linux-程序员宅基地

文章浏览阅读630次。这里用到的Linux系统是centos7系统,centos7是自带py的但是py的2.7.5版本 连接服务器的使用的是SSH Secure shell1.首先安装依赖包1)安装gcc编译器  gcc编译器有些系统版本已经默认安装了,可以通过 gcc --version进行查看     安装gc..._python3.7 安装 linux

BootStrap3.X模态框垂直居中显示_bootstrap3 弹出框 垂直居中-程序员宅基地

文章浏览阅读9.5k次。当点击按钮时modal的位置看起来很不舒服, 解决办法总结有两: 1.使用modal 弹出事件方法;   从官方文档中可以了解到, modal组件有不少事件接口: 其中 “shown.bs.modal”可以在弹窗框出现后 做一些处理, 更改弹出框的样式当然是可以的: script type="text/javascript"> $(_bootstrap3 弹出框 垂直居中

P4 开发实践 — 软件 DSL 架构_p4 dsl-程序员宅基地

文章浏览阅读1.1k次。P4 实现了一种 Programmable Match-Action Pipeline(流水线可编程)架构,作为 Pipeline,就是:开发者可以自定义 Match Fields、自定义 Action Type、从而实现自定义的 Match-Action Table,再由多张这样的 Tables 进而形成一条 Pipeline。_p4 dsl

【Unity实战篇 】| 2.5D游戏是如何做出来的呢,2.5D游戏快速制作教程_unity 开发2.5d游戏-程序员宅基地

文章浏览阅读4.5w次,点赞80次,收藏158次。玩过游戏的朋友都知道,市面上最常见的游戏多数分为2D和3D两种。2D和3D游戏之间的差异大家都知道,一个是类似纸片游戏属于二维层面,另一个则是在3D立体空间中游玩。其中还夹杂着一个2.5D游戏,本篇文章就来讲一下怎么通过Unity进行2.5D游戏是怎样的以及如何制作2.5D游戏。制作方法很简单,文中使用到了Tile Map Editor制作2D地图,通过控制相机角度来形成伪3D来制作2.5D效果的游戏。下面就一起来看看到底是怎样制作的吧!_unity 开发2.5d游戏

汇编实验——分类统计字符个数count_char_汇编分类统计字符个数-程序员宅基地

文章浏览阅读6.3k次,点赞3次,收藏9次。;************************************************************实验代码datarea segment mess1 db 'Please enter character string : ',13,10,'$'_汇编分类统计字符个数

推荐文章

热门文章

相关标签