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

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)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值