RxSwift和Combine的相同点和使用例子

news/2024/7/20 20:55:21 标签: rxswift, ios, swift, Combine

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的文字输入变化

swift">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的文字输入变化

swift">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框架监听键盘高度变化

swift">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框架监听键盘高度变化

swift">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)
    }
}

http://www.niftyadmin.cn/n/5183040.html

相关文章

【2023C卷题限时免费】20天拿下华为OD笔试之 【不定滑窗】2023C-最长的指定瑕疵度的元音子串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 示例三输入输出说明 解题思路滑窗三问滑窗三答 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 头和结尾都是元音字母&#xff08;a…

2311vim极语言加高亮

1,在vim的\syntax目录中,新建ji.vim及极关键.vim.ji.vim内容如下. source $VIMRUNTIME/syntax/cpp.vim "把cpp作为基础." source $VIMRUNTIME/syntax/极关键.vim "加上极关键字." set autoindent "自动缩进."2,极关键.vim如下: syn keyword Jj…

WorkPlus AI助理知识问答机器人,助力企业级私有化AI构建

ChatGPT以及其他大语言模型展现了令人惊叹的广博知识、语义理解能力与创造能力。它们能够在会话中承认自身错误并进行改正&#xff0c;还能进行一定程度的逻辑推理&#xff0c;具备多语种翻译与多语言编程等"超能力"&#xff0c;可胜任多种自然语言处理任务。 然而&…

初识VBA代码及应用VBA代码第四节:如何录制宏

《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的第七套教程&#xff0c;定位于初级&#xff0c;目前是第一版修订。这套教程从简单的录制宏开始讲解&#xff0c;一直到窗体的搭建&#xff0c;内容丰富&#xff0c;实例众多。大家可以非…

HTML5中自定义数据属性data-*属性(3)jq如何操作data-*

HTML5中自定义数据属性(1)data-*属性(1)data-*属性的使用HTML5中自定义数据属性(2)&#xff1a;data-*的使用HTML5中自定义数据属性data-属性(3)jq如何操作data- 在 jQuery 中&#xff0c;可以使用 data() 方法来获取 data-* 属性的值。这个方法可以读取或设置 HTML 元素上的 …

如何选择正确的SSL证书?

SSL证书已经成为网站安全管理的重要部分&#xff0c;但是市场上SSL证书种类繁多&#xff0c;很多新手在初次购买时都会感到困惑。下面我们就一起来看看如何快速地选择正确的SSL证书。 第一步&#xff1a;明确SSL证书的主要分类 SSL证书主要有三种类型&#xff1a;单域名证书、…

算法--搜索与图

这里写目录标题 主要内容DFS思想 BFS思想 DFS与BFS的比较一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 主要内容 DFS 思想 会优先向深处搜索 一旦到达最深处 那么会回溯 但是在回溯的过程中 会边回溯边观察是否有能继…

Python接口测试框架选择之pytest+yaml+Allure!

一、为什么选择pytest&#xff1f; pytest完全兼容python自带的unittest pytest让单元测试更简单&#xff0c;能很好的管理测试用例。 对于实现接口测试的复杂场景&#xff0c;pytest的fixture、PDB等高阶用法都能实现需求。 入门简单&#xff0c;对于代码基础薄弱的团队人…