当前位置:首页 » 《随便一记》 » 正文

RxSwift 响应式编程_yokan_de_s的博客

24 人参与  2021年12月22日 11:26  分类 : 《随便一记》  评论

点击全文阅读


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

比如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)

 具体用法参照代码


点击全文阅读


本文链接:http://zhangshiyu.com/post/31913.html

监听  的是  事件  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 拍卖会点天灯后,男友拍卖我365张私房照全书+后续(林书雅秦斯年)免费_拍卖会点天灯后,男友拍卖我365张私房照全书+后续精彩(林书雅秦斯年)
  • 人面桃花长相忆正版(阮雾梨闻砚辞)_人面桃花长相忆正版
  • 五一老婆难产大出血,我却在4s店买劳斯莱斯后续完整大结局_[清清兰博基尼江荣]人气小说未删减节选
  • 人面桃花长相忆精选(阮雾梨闻砚辞)全书免费_(阮雾梨闻砚辞)人面桃花长相忆精选后续(阮雾梨闻砚辞)
  • 转身即漫漫霜华(顾司爵叶诗言),转身即漫漫霜华
  • 拍卖会点天灯后,男友拍卖我365张私房照全书+后续+结局(林书雅秦斯年)列表_拍卖会点天灯后,男友拍卖我365张私房照(林书雅秦斯年)拍卖会点天灯后,男友拍卖我365张私房照全书+后续+结局在线
  • (番外)+(结局)阮雾梨闻砚辞(人面桃花长相忆+结局+番外)_(阮雾梨闻砚辞)列表_笔趣阁(人面桃花长相忆+结局+番外)
  • [清风遥相止,不复绕君心]免费试读_萧尘逸清瑶嫣然完结
  • 女友嫌我是上不了台面的古惑仔,我离开后她却悔疯了小说章节免费试读_「女友沈重小混混」反转剧情试读片段
  • 顾司爵叶诗言(转身即漫漫霜华结局+番外)_顾司爵叶诗言列表_笔趣阁(转身即漫漫霜华结局+番外)
  • 转身即漫漫霜华***(顾司爵叶诗言),转身即漫漫霜华***
  • 锈蚀爱恨叩凡心在线看(慕泾川)_锈蚀爱恨叩凡心在线看

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1