IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> RxSwift 响应式编程 -> 正文阅读

[移动开发]RxSwift 响应式编程

响应式编程已经出了很完整的框架了

比如ReactiveCocoa 简称RAC,前段时间有个项目是这个框架(感觉贼鸡儿晦涩难懂,完全把编程思路要整个转换,如果之前不是用这个编程范式),ReactiveCocoa是专门针对的OC Swift,换句话说暂时来说是适配苹果各平台开发(iOS,Mac)

再比如ReactiveX,这个这个版本支持的语言就更多了,也不是很重要,就不细较了,唯一值得在意的是RXSwift

use_frameworks!
target 'UItest' do
  pod 'RxSwift','~>5'
  pod 'RxCocoa','~>5'
end

然后pod install完成第三方库安装,这里是用的cocoapods的方式,安装好了说说

使用教程:

1.导入

import RxSwift   //不包括iOS的任何特性
import RxCocoa   //包含iOS UI等一些东西

?2.响应式编程的重要角色

Obsevable : 负责发送事件(event)

Observer: 负责订阅Obsevable,监听Obsevable发送的事件(我觉得这里应该叫事件队列,因为很可能是一串数据)

这个过程有点类似于KVO,过程中重要的是事件

public enum Event<Element> {
    /// Next element is produced.
    case next(Element)

    /// Sequence terminated with an error.
    case error(Swift.Error)

    /// Sequence completed successfully.
    case completed
}

RxSwift官方定义事件是个枚举,如上图,有三个case,可见事件是有三个状态,1.next携带了具体数据,x携带的是个Element,这是个泛型,也就是数据类型不定。2.error,是一个错误信息,具体传出的是Swift.Error ,整个过程会终止。3.completed 这个完成是队列完成的意思,表示这一个监听过程整个完成了,并没有出错

所以可以确定正常的事件,传递的是next,因为2,3显然说明事件异常终止,或者顺利完成

3.基本运用

enum MYError:Error {case test }
        let observable = Observable<Int>.create { observer in  //创建个 observable
            observer.onNext(1)                                  //发送事件
            observer.onNext(2)
            observer.onNext(3)
            observer.onError(MYError.test)
            observer.onCompleted()
            observer.onNext(4)
            return Disposables.create()
        }
        
        observable.subscribe { event in    //注册监听
            switch event
            {
                case .next(let content):
                    print(content)
                case .error(let error):
                    print(error)
                case .completed:
                    print("完成")
            }
        }

上述就是RX的基本运用,实战里面发消息和接消息的一般在两个不同的类,从打印的log也可以看出,不管是onError还是onCompleted(代码位置有限就没单独展示区别),之后就会结束这个响应过程

observable.subscribe { content in
            print(content)
        } onError: { error in
            print(error)
        } onCompleted: {
            print("完成")
        } onDisposed: {
            print("注销")
        }

监听还有一种方式,区别不是很大,但会多一个注销,注销和完成是类似的,区别在于,注销是由监听者结束这个响应流程,而Completed是由消息发送者结束

 let disp = observable.subscribe { event in    //注册监听
            switch event
            {
                case .next(let content):
                    print(content)
                case .error(let error):
                    print(error)
                case .completed:
                    print("完成")
            }
        }
disp.dispose()

这是注册监听的返回值,所以注销的权限是由监听持有(虽然我这里写在了一个函数里,实际实战监听和发送者肯定不在一起)

let observable = Observable.just(1)
       
let disp = observable.subscribe { content in
            print(content)
    } onError: { error in
            print(error)
    } onCompleted: {
            print("完成")
    } onDisposed: {
            print("注销")
    }
disp.dispose()

?如果不是需要经常发送,也有单次发送

4.UI层面的运用

程序常需要一些计时器之类的东西,比如登录注册页面的短信倒计时,这事解决办法挺多了,说下RX的解决方式

let observable = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
observable.map{"\($0)"}.bind(to: label.rx.text)

需要很复杂的操作,也可以用subscribe函数进行高度自定义,这里就只是展示计时器和bind函数,timer还能用的是两个函数,一个不需要延时,这个是高度定制的可延时函数,

后面的bind是必须用rx的,这个rx的详细参见前面的协议编程,里面做过特殊处理的,这里不是直接传入label.text就可以的

然后UI层面最重要的我感觉就是Binder

let label = UILabel.init(frame: CGRect(x: 0, y: 50, width: UIScreen.main.bounds.width, height: 25))
self.view.addSubview(label)
        
let binder = Binder<Int>(label, binding: { label, v in
    label.text =  "剩余" + "\(160 - v)"
})
let _ = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance).subscribe(binder)

?具体用法参照代码

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:05:55  更:2021-09-19 08:06:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:11:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码