• 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 ?? ""
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    使用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)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

    使用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)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    使用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)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    【MYSQL】表操作
    Intel 700 800系网卡升级支持WOL UEFI PXE方法
    面试逻辑题,有8个小球和一个天平,一个小球偏重,其它小球一样重,问最少称几次可以找出那个重球?
    re:从0开始的CSS之旅 17. 定位
    PostgreSQL10安装postgis插件
    VB.net读写S50/F08IC卡,修改卡片密码控制位源码
    基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作
    stable diffusion API接口 + 扩展接口
    模仿苹果生态系统,谷歌2022年将致力于跨平台设备整合
    Python「面向对象基本语法2」引用概念、方法中的self参数、代码示例
  • 原文地址:https://blog.csdn.net/u013538542/article/details/134426757