RxSwift之环境的搭建配置与基础控件的使用

举报
Serendipity·y 发表于 2022/02/17 00:53:03 2022/02/17
【摘要】 Rx 简介 一、什么是 Rx? Rx 是 Reactive X 的缩写,简单来说就是基于异步 Event(事件)序列的响应式编程。Rx 可以简化异步编程方法,并提供更优雅的数据绑定,让我们可以时刻响应...

Rx 简介

一、什么是 Rx?
  • Rx 是 Reactive X 的缩写,简单来说就是基于异步 Event(事件)序列的响应式编程。
  • Rx 可以简化异步编程方法,并提供更优雅的数据绑定,让我们可以时刻响应新的数据同时顺序地处理它们。
  • ReactiveX(Reactive Extensions)是通过可观察的流实现异步编程的一种API,它结合了观察者模式、迭代器模式和函数式编程的精华。RxSwift 是 ReactiveX 编程思想的一种实现,几乎每一种语言都会有那么一个 Rx[xxxx] 框架,比如Rxswift,RxJava,RxJS 等。
二、Rx 库
  • Rx 本身可以说是一种跨平台的标准,它有自己的社区论坛,不管是 web 还是移动开发,都能用 Rx 的思维和方法来完成你的工作。
  • 作为一种跨平台标准,目前已经有许多基于不同开发语言的 Rx 的库。除了 RxSwift 之外,还有 RxJava,RxJS, RxKotlin, Rx.NET等库。
  • Rx 库虽然用的语言不同,但它们之间其实都是相通的,都有相同的 API。所以说如果以后使用别的语言做其他的方面的开发,同样是可以使用相同的思维甚至相同的方法接口(除了语言不同)来编程。
  • ReactiveX 不仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。它拓展了观察者模式,能够自由组合多个异步事件,而不需要去关心线程,同步,线程安全,并发数据以及I/O阻塞。
  • RxSwift 是 Rx 为 Swift 语言开发的一门函数响应式编程语言, 它可以代替iOS系统的 Target Action / 代理 / 闭包 / 通知 / KVO,同时还提供网络、数据绑定、UI事件处理、UI的展示和更新、多线程等。

RxSwift 的安装与配置

一、手动安装
  • Github 上下载最新的代码;
  • 将下载下来的源码包中 Rx.xcodeproj 拖拽至工程中;
  • 工程 -> General -> Embedded Binaries 项,把 iOS 版的 RxSwift.framework、RxCocoa.framework 添加进来。
二、CocoaPods 安装
  • 替换 YOUR_TARGET_NAME 然后在 Podfile 目录下;
	use_frameworks!
	
	target 'RxSwift基本使用' do
	  # Comment the next line if you don't want to use dynamic frameworks
	  
	  # Pods for RxSwift基本使用
	
	  pod 'RxSwift', '~> 5'
	  pod 'RxCocoa', '~> 5'
	
	  target 'RxSwift基本使用Tests' do
	    inherit! :search_paths
	    # Pods for testing
	    pod 'RxBlocking', '~> 5'
	    pod 'RxTest', '~> 5'
	  end
	
	  target 'RxSwift基本使用UITests' do
	    # Pods for testing
	  end
	
	end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 终端输入
	$ pod install

  
 
  • 1
  • 使用 RxSwift 的地方 import
	import RxSwift
	import RxCocoa

  
 
  • 1
  • 2
  • RxSwift:它只是基于 Swift 语言的 Rx 标准实现接口库,所以 RxSwift 里不包含任何 Cocoa 或者 UI方面的类。
    RxCocoa:是基于 RxSwift针对于 iOS开发的一个库,它通过 Extension 的方法给原生的比如 UI 控件添加了 Rx 的特性,使得容易订阅和响应这些控件的事件。

使用示例

一、UITextField
  • 监听单个 textField 内容的变化(文本响应):
		self.textField.rx.text.orEmpty
            .subscribe(onNext: { (text) in
                if text.count > 0 {
                    print(text)
                }
            })
            .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 效果展示
    在这里插入图片描述
		1
		12
		123
		1234
		12345
		123456
		1234567
		12345678
		123456789

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 使用 change 事件效果一样:
		self.textField.rx.text.orEmpty.changed
            .subscribe(onNext: {
                if text.count > 0 {
                    print(text)
                }
            })
            .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
二、UIButton
  • 实现UIButton点击事件响应:
		self.button.rx.tap
            .subscribe(onNext: {  [weak self] in
                print(self?.button.titleLabel?.text as Any)
            }).disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 修改UIButton的Control.Events:
        self.button.rx.controlEvent(.touchUpOutside)

  
 
  • 1
  • 将UITextField的输入内容绑定到UIButton属性:
		self.textField.rx.text
            .bind(to: self.button.rx.title())
            .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 效果展示
    在这里插入图片描述
三、UIScrollView
		self.scrollView.rx.contentOffset
            .subscribe(onNext: { (content) in
                self.view.backgroundColor = UIColor.init(red: content.y / 255.0 * 0.4, green: content.y / 255.0 * 0.6, blue: content.y / 255.0 * 0.8, alpha: 1)
            })
        .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
四、手势
		let gesture = UITapGestureRecognizer()
	    self.label.isUserInteractionEnabled = true
	    self.label.addGestureRecognizer(gesture)
	    gesture.rx.event.subscribe(onNext: { (tap) in
	         print(tap.view as Any)
	         })
	         .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
五、通知
			NotificationCenter.default.rx.notification(UIResponder.keyboardDidShowNotification)
            .subscribe(onNext: { (notification) in
                print(notification)
            })
        .disposed(by: disposeBag)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
六、KVO
		self.boy.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (value) in
                print(value as Any)
            })
            .disposed(by: disposeBag)


	override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    	self.boy.name = "girl"
    	print(self.boy.name)
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
七、NSTimer
  • 避免了实现定时器的runloop影响、销毁问题、线程问题;
		// 方法一:timer定时器
		/// 创建重复多次执行序列
        /// 参数1: 几秒后开始第一次执行
        /// 参数2: 重复执行间隔
        /// 参数3: 调度者
        let timer = Observable<Int>.timer(1, period: 2, scheduler: MainScheduler.instance)

        /// 添加订阅
        timer.subscribe { (event) in
            print(event)
        }.disposed(by: disposeBag)

		// 方法二:timer定时器
func setupTimer() {
    timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer.subscribe(onNext: { (num) in
        print("\(num)")
    }).disposed(by: disposeBag)
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
八、URLSession 网络请求
		URLSession.shared.rx.response(request: URLRequest.init(url: URL.init(string: "https://www.baidu.com")!))
            .subscribe(onNext: { (response, data) in
                print(response)
            })
            .disposed(by: disposeBag)
            

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
九、UITextView

UITextView有如下委托回调方法:

  • didBeginEditing:开始编辑
  • didEndEditing:结束编辑
  • didChange:编辑内容发生改变
  • didChangeSelection:选中部分发生变化
		// 编辑响应
        textView.rx.didBeginEditing
            .subscribe(onNext: {
                print("开始编辑")
            })
            .disposed(by: disposeBag)
         
        // 结束编辑响应
        textView.rx.didEndEditing
            .subscribe(onNext: {
                print("结束编辑")
            })
            .disposed(by: disposeBag)
         
        // 内容发生变化响应
        textView.rx.didChange
            .subscribe(onNext: {
                print("内容发生改变")
            })
            .disposed(by: disposeBag)
         
        // 选中部分变化响应
        textView.rx.didChangeSelection
            .subscribe(onNext: {
                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

完整示例

RxSwift基础使用

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/108394921

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。