RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验

简介: RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验

1. MVVM架构简介

对于MVVM架构,大家一定都已不再陌生,网上的资料随意一搜遍地都是,这里就不再过多的赘述,简单说一下MVVM架构结合RxSwift的使用,以及各自的分工,请看下面这张图:

注意:MVVM架构并不是一定得结合函数响应式编程RxSwift或者RAC等,只是他们的结合会使得代码更加的简洁,消息的传递更加简单化。


Model

提供数据支持,在里面定义需要的属性等;


ViewModel

主要职责就是对数据进行转换处理,ViewModel中设计Input结构体Output结构体的作用主要是使得事件的流向更加的清晰;Input所扮演的角色,主要是接收View所传递过来的事件(点击、输入、滚动等),ViewModel内部通过transform函数转换,返回OutPutOutput的作用主要是保存处理后的结果,用于将来绑定到UI,从而实现了ViewViewModel层完全的解耦;


View

主要作用就是视图的布局、动画、跳转等,将来会把所需的事件传递给ViewModelInput中,通过ViewModel的数据转换,把ViewModel中的Output绑定到对应的UI控件上;在MVVMController也会归属到View中,职责类似;


2. 关注功能实战

需求:页面内有一按钮,有“关注”和“取消关注”两种状态,进入页面通过网络请求获取初始状态,然后通过点击,发起请求,切换不同的状态,具体实现如下:


Model层

声明按钮的初始状态属性,isAttention用于存储是否关注的状态;




class AttentionModel {
    var isAttention = false
}


View层

主要是创建控件、以及ViewModel实例,并把按钮的点击事件传递到ViewModelInput中,ViewModel内部通过transform函数,对input中的事件进行处理,再把ViewModel中的Output和按钮的状态attentionButton.rx.isSelected绑定在一起;

private func bindToViewModel() {
    let output = viewModel.transform(input: AttentionViewModel.Input(attention: attentionButton.rx.tap))
    output.attentionStatus.bind(to: attentionButton.rx.isSelected).disposed(by: disposeBag)
}


ViewModel层

Input:保存传递过来的按钮点击事件;

Output:绑定按钮状态数据到View层;

transformViewModelattention作用主要是用于存储当前的按钮状态;transform函数内部initAction 主要是用于请求更新按钮初始时的状态,attentionAction主要是当按钮点击的时候发起请求,待收到响应后,更新响应结果,通过merge两者的状态,利用OutputattentionStatus回调给外界进行绑定;


struct AttentionViewModel {
    //false代表未关注 true已关注
    private var attention = BehaviorRelay<Bool>(value: false)
    struct Input {
        let attention: ControlEvent<Void>
    }
    struct Output {
        let attentionStatus: Observable<Bool>
    }
    func transform(input: Input) -> Output {
        let initAction = requestInit()//请求初始数据
        let attentionAction = input.attention.flatMap({ request(!attention.value)} ).observe(on: MainScheduler.instance).share(replay: 1) //关注、取消关注点击
        //合并结果-把按钮点击或者请求初始数据的时候都去更新关注按钮状态
        let attentionStatus = Observable.of(attentionAction, initAction).merge()
        return Output(attentionStatus: attentionStatus)
    }
    private func request(_ isAttention: Bool) -> Observable<Bool> {
        return Observable<Bool>.create { (observer) -> Disposable in
            Logger("发起更新状态请求\nLoading...")
            DispatchQueue.global().asyncAfter(deadline: .now() + 2, execute: {
                Logger("响应更新状态结果...isAttention = \(isAttention)")
                observer.onNext(isAttention)//是否关注
                self.attention.accept(isAttention)// 关注或取消关注成功、存储状态
            })
            return Disposables.create()
        }.subscribe(on: ConcurrentDispatchQueueScheduler(qos: .userInteractive))
    }
    private func requestInit() -> Observable<Bool> {
        return Observable<Bool>.create { (observer) -> Disposable in
            Logger("正在请求初始状态\nLoading...")
            DispatchQueue.global().asyncAfter(deadline: .now() + 1, execute: {
                let model = AttentionModel()//模拟将请求结果转换为Model...
                model.isAttention = true //假设默认状态为已关注
                Logger("初始状态响应结果...isAttention = \(model.isAttention) \n")
                //Event处理...
                observer.onNext(model.isAttention)//用于通知View去更新关注状态
                attention.accept(model.isAttention)//存储关注的状态
            })
            return Disposables.create()
        }.subscribe(on: ConcurrentDispatchQueueScheduler(qos: .userInteractive))
    }
}

运行结果:

Log - 正在请求初始状态
Loading...
Log - 初始状态响应结果...isAttention = true 
Log - 发起更新状态请求
Loading...
Log - 响应更新状态结果...isAttention = false

划线


相关文章
|
3月前
|
人工智能 监控 前端开发
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
支付宝「AI 出行助手」是一款集成公交、地铁、火车票、机票、打车等多项功能的智能出行产品。
589 21
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
660 3
|
3月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
633 0
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
280 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构
|
2月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
407 7
|
3月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
795 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
2月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。

热门文章

最新文章