RXswif的使用

news/2024/7/23 15:32:43 标签: swift, ios, Rxswift

swift_0">Rxswift的个人理解

swift__1">新项目需要使用到RXswift 所以来整理一下

先来看看基础描述:

RxSwift的核心思想是 Observable
sequence,Observable表示可监听或者可观察,也就是说RxSwift的核心思想是可监听的序列。
并且,Observable sequence可以接受异步信号,也就是说,信号是可以异步给监听者的
Observable(ObservableType) 和 SequenceType类似
ObservableType.subscribe 和 SequenceType.generate类似
由于RxSwift支持异步获得信号,所以用ObservableType.subscribe,这和indexGenerator.next()类似
其中SequenceType是Swift(2.3以前版本,之后的版本没有该协议)中的一个协议,比如Swift中的Array就遵循这个协议,通过这个协议,你可以这样的去操作一个Array

来简单操作体验一下 UIbutton

创建一个新工程然后把下面方法拷贝进去

swift">    fileprivate lazy var Dbag = DisposeBag()
    func setupConstraints() {
        let button1 = UIButton(frame: CGRect(x: 50, y: 100, width: 300, height: 40))
        button1.setTitle("button1", for: .normal)
        button1.backgroundColor = .yellow
        button1.addTarget(self, action: #selector(button1Method), for: .touchUpInside)
        
        /** Rxswift init button*/
        let button2 = UIButton(frame: CGRect(x: 50, y: 150, width: 300, height: 40))
        button2.JSSetTileAndBColor(title: "button2", state: .normal, backgroundColor: .purple)
        button2.rx.tap.subscribe{(event) in
            print("999")
        }.disposed(by: Dbag)
        
        self.view.addSubview(button1)
        self.view.addSubview(button2)
    }
    @objc func button1Method(){
        print("888");
    }
swift"> extension UIButton{
        func JSSetTileAndBColor(title:String,
                                state:UIControl.State,
                                backgroundColor:UIColor) -> UIButton {
          self.setTitle(title, for: state)
          self.backgroundColor = backgroundColor
          return self
     }

UITextfile

接下来新建两个textfile通过rxswift 分别用on和onNext去做观察,同时更新label的text属性:

swift"> let textfile1 = UITextField(frame: CGRect(x: 50, y: 200, width: 150, height: 40))
        textfile1.backgroundColor = .white
        let textfile2 = UITextField(frame: CGRect(x: 210, y: 200, width: 150, height: 40))
            textfile2.backgroundColor = .white
        let label1 = UILabel(frame: CGRect(x: 50, y: 240, width: 500, height: 40))
        
        textfile1.rx.text.subscribe { (event:Event<String?>) in
            label1.text = event.element!
        }.disposed(by: Dbag)
        
        textfile2.rx.text.subscribe { (text:String!) in
            label1.text = text!
        }.disposed(by: Dbag)
        self.view.addSubview(textfile1)
        self.view.addSubview(label1)
        self.view.addSubview(textfile2)

效果图在这里插入图片描述
因为添加了观察所以每当我updatetextfile都能直接作用到label上。

UIScrollerView

swift">import Foundation
import UIKit
import RxSwift
class JScrollerViewController: UIViewController{
    fileprivate let bag = DisposeBag()
    fileprivate let _scrollerview = UIScrollView()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(_scrollerview)
        _scrollerview.frame = self.view.frame;
        _scrollerview.contentSize = CGSize(width: self.view.width, height: self.view.height*2);
        _scrollerview.rx.contentOffset.subscribe{(_point:CGPoint? )in
            print("contentoff.y:\(_point!.y)")
        }.disposed(by: bag)
    }
    
    
}

这里可以说一下如果subscribe的disposed 不传disposeBag则只会调用一次回调,在拷贝的时候可以试下
在这里插入图片描述

然后再试下给struct添加观察

swift">    func testRxswiftNever(){
       Observable<String>.never().subscribe { (_) in
            print("never show")
        }.disposed(by: Dbag)  //该语句不会执行
    }

never就是创建一个sequence,不发出任何事件信号

swift">    func testRxswiftEmpty(){
        Observable<Int>.empty().subscribe{(event)in
            print(event)
        }.disposed(by: Dbag)
    }

empty就是创建一个空的sequence,只能发出一个complected事件
event 的类型就是Competed

swift">    func testRxswiftJust(){
        Observable<Int>.just(3).subscribe{(event)in
            print("just:\(event)")
        }.disposed(by: Dbag)
    }

just是创建一个sequence只能发出一种特定的事件,能正常结束
这里会输出2次 : just:next(3) / just:compete

swift">    func testRxswiftOf(){
        Observable.of("1","3","5","7").subscribe(onNext: {
            print("of\($0)")
        }).disposed(by: Dbag)
    }

of是创建一个sequence能发出很多种事件信号,分别输出of:1,of:3,of:5,of:7

我们也可以自定义可观察的sequence,那就是使用create

create操作符传入一个观察者observer,然后调用observer的onNext,onCompleted和onError方法。返回一个可观察的obserable序列

swift">    fileprivate func myobserable() -> Observable<Any> {
        return Observable.create({ (observal: AnyObserver<Any>) -> Disposable in        
        	observal.onNext("1")
         	observal.onNext("2")
            observal.onCompleted()
            return Disposables.create()
        })
    }

range(给定范围, 依次显示)

swift">        Observable<Int>.range(start: 1, count: 4).subscribe {
        (event: Event<Int>) in
            print(event)
            
        }.disposed(by:Dbag)

range就是创建一个sequence,他会发出这个范围中的从开始到结束的所有事件Observable,必须指定数据类型: 输出next(0)~next(3)还有compete

repeatElement(重复执行)

创建一个sequence,发出特定的事件n次

swift">    func Rxswift(){
        Observable.repeatElement("1").take(3).subscribe(onNext: {
            print($0)
        }).disposed(by: Dbag)
    }

这样就会输出三次1,并且没有compete

generate(类似于for循环)

generate是创建一个可观察sequence,当初始化的条件为true的时候,他就会发出所对应的事件

swift">    func RxswiftGenerate(){
        _=Observable.generate(initialState: 1, condition: {$0<5}, iterate: {$0+1}).subscribe({
            print("generate\($0)")
        }).disposed(by: Dbag)
    }

打印输出:
generatenext(1)
generatenext(2)
generatenext(3)
generatenext(4)
generatecompleted

未完待续


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

相关文章

Go单元测试基础

Go单元测试基础1.go test工具2.单元测试函数3.go test -v/go test -run4.跳过某些测试用例5.子测试6.表格驱动测试7.并行测试8.使用工具生成测试代码9.测试覆盖率1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的&#xff0c;并不需…

jQuery《一篇搞定》

今日内容 一、JQuery 零、 复习昨日 1 写出至少15个标签 2 写出至少7个css属性font-size,color,font-familytext-algin,background-color,background-image,background-sizewidth,heighttop,bottom ,left ,rightpositionfloatbordermarginpadding 3 写出input标签的type的不…

VScode SSH远程虚拟机中ubuntu系统开发以及解决SSH需要频繁输入密码问题

1. 安装VSCODE及插件 VSCODE直接去官网下载即可 https://code.visualstudio.com/在Vscode应用商店中搜索Remote-SSH并安装 2. SSH连接ubuntu系统 eg:ssh root@192.168.31.75或者直接输入ip地址192.168.31.75都可以 3. 选择SSH配置文件,可以直接选择点击第一个C盘Users目录下…

解决:在STM32的标准库上添加DSP库时error: #247

DSP库相对于标准的“math.h”对浮点计算做了优化和增强&#xff0c;运算速度更快。关于STM32如何添加DSP库&#xff0c;网上有很多教程&#xff0c;笔者在实际操作时发现会遇到keil报error: 247的问题。针对于解决过程&#xff0c;在此做一个记录。【错误原因】error: 247&…

Redis基本原理了解

Redis事务控制 1&#xff0c;概念&#xff1a; redis事务就是一个命令执行的队列&#xff0c;将一系列预定义命令包装成一个整体&#xff08;一个队列&#xff09;。当执行时&#xff0c;一次性按照添加顺序依次执行&#xff0c;中间不会被打断或者干扰。一个队列中&#xff…

CGO总结

概述 cgo作为一个强大的工具&#xff0c;可以让go轻松实现调用c语言的巨额遗产。。。 问题 实际开发中&#xff0c;发现使用go语言调用c的动态库时&#xff0c;经常出现传入c的字符串发生变化的现象&#xff0c;如下&#xff1a; 情况1 由a.txt变为a.txt$\n 情况2 由plai…

Linux中定时删除指定日期和天数的log日志文件

不管是测试环境还是正式环境,由于我们运行的服务往往会产生大量的日志文件,如果忘记清理,容易造成磁盘空间不足,因此最好是利用 linux 自带的定时任务功能去定时清理日志. 1.创建 shell脚本,赋权限 vim clean_tomcatlog.sh chmod x clean_tomcatlog.sh 2.编写脚本(可以对多…

电脑怎么转换图片分辨率?照片如何看分辨率?

很多小伙伴都不知道怎么去改图片分辨率&#xff08;https://www.yasuotu.com/dpi&#xff09;&#xff0c;尤其是在上传证件照信息、各种考试平台上传个人照片的时候&#xff0c;这里小编告诉大家一个特别简单的修改图片分辨率的方法&#xff0c;使用压缩图的图片处理工具&…