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

划线


相关文章
|
2月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
74 12
|
3月前
|
前端开发
什么是MVVM架构?
MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。MVVM模式有助于将应用程序的业务和表示逻辑与用户界面 (UI) 清晰分离。 保持应用程序逻辑和UI之间的清晰分离有助于解决许多开发问题,并使应用程序更易于测试、维护和演变。 它还可以显著提高代码重用机会,并允许开发人员和UI设计人员在开发应用各自的部分时更轻松地进行协作。
45 2
|
2天前
|
弹性计算 监控 数据挖掘
事件驱动架构的优势与应用:深度解析与实战应用
【8月更文挑战第17天】事件驱动架构以其松耦合、可扩展性、异步处理、实时性和高可靠性等优势,在实时数据处理、复杂业务流程、弹性伸缩和实时通信等多个领域展现出巨大的应用潜力。通过合理应用事件驱动架构,可以构建灵活、可扩展和可维护的系统架构,满足不断变化的业务需求和技术挑战。对于开发者而言,深入理解事件驱动架构的核心概念和优势,将有助于更好地设计和实现高质量的软件系统。
|
17天前
|
XML 存储 Android开发
Android实战经验之Kotlin中快速实现MVI架构
本文介绍MVI(Model-View-Intent)架构模式,强调单向数据流与不可变状态管理,提升Android应用的可维护性和可测试性。MVI分为Model(存储数据)、View(展示UI)、Intent(用户动作)、State(UI状态)与ViewModel(处理逻辑)。通过Kotlin示例展示了MVI的实现过程,包括定义Model、State、Intent及创建ViewModel,并在View中观察状态更新UI。
56 12
|
1月前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
2月前
|
监控 API 数据库
构建高效后端:微服务架构的实战指南
【6月更文挑战第14天】在数字化浪潮下,后端开发面临着前所未有的挑战和机遇。本文将深入探讨微服务架构的设计理念、实现方式及其在现代软件开发中的重要性,为读者提供一份全面而实用的微服务实战手册。
38 2
|
2月前
|
调度
【灵动之链】打造高效处理架构的双轨组合模式实战
【灵动之链】打造高效处理架构的双轨组合模式实战
|
3月前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
97 7
|
2月前
|
前端开发 测试技术 API
探索安卓应用的架构演进:从MVC到MVVM
本篇文章将深入探讨安卓应用开发中的架构演进,特别关注从传统的MVC(Model-View-Controller)到现代流行的MVVM(Model-View-ViewModel)架构的转变。通过对比两种架构的设计理念、实现方式和实际应用案例,解析MVVM在提高代码可维护性和可测试性方面的优势。
35 0
|
3月前
|
前端开发 中间件 程序员
app的组件化之路:业务组件化与中间件,MVVM架构的作用
app的组件化之路:业务组件化与中间件,MVVM架构的作用
45 0