首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RxSwift底层原理及结合MVVM架构在项目中的应用

为什么要用它 开发过程,状态以及状态之间依赖过多, RxSwift更加有效率地处理事件,而无需显式去管理状态。在命令式编程,状态变化是最难跟踪,最头痛的事。这个也是最重要的一点。...####订阅者(Subscriber) 事件的最终处理者 ####管道(Sink) Observer 和 Observable 沟通的桥梁:Sink相当与一个加工者,可以将源事件流转换成一个新的事件,...如果将事件比作水流,事件的传递过程比作水管,那么Sink就相当于水管一个转换头。...+Moya+MVVM 对现有网络请求的改造 由于之前网络请求返回的都是一个对象,接入RxSwift,最好将返回的对象定义为Observable类型,这样我们的业务模块才能方便的订阅返回的数据 extension...MVVM架构模式把业务逻辑从controller集中到了ViewModel,方便进行单元测试和自动化测试 ViewModel的业务模型如下: viewmodel相当于是一个黑盒子,封装了业务逻辑,进行输入和输出的转换

1.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

Swift + RxSwift MVVM 模块化项目实践

error) } }) .disposed(by: disposeBag) 上面的代码 通过信号筛选,reloadTrigger代表点击重新加载的事件,经过参数格式化、发送网络请求...RxSwift的使用 ---- 项目中大部分的逻辑处理是借助 RxSwift 实现的响应式编程,当界面上的每个操作都会转换为一个信号然后通过对信号的各种加工网络请求,到返回的数据 JSON 解析以及错误对象的处理...网络请求 ---- NetWorkCore通过对Alamofire简单封装,配合RxSwift可以很简单的实现一个网络请求,并且完成数据解析对应的 Mode 实体类,如下所示,即可实现一个用户登录的网络请求...App 的时候需要考虑处理的,比如在下拉列表的时候,发送网络请求,这时候网络请求失败了,需要界面上展示网络错误,并且显示重新加载的按钮,或者是如果在调用相机获取授权的时用户没有授权的时候,需要提示给用户授权相关的信息...,等等这些逻辑处理都可以通过的形式处理,在处理用户网络错误加载失败的时候,通过 RxSwift一个很简单的 Api:withLatestFrom就能实现数据重新加载,而不需要记住各种复杂的参数。

3.1K101

moya + RxSwift 进行网络请求

的使用非常简单,通过TargetType协议定义好每个target之后,就可以直接使用Moya开始发送网络请求了。...的扩展 filterSuccessfulStatusCodes()是Moya为RxSwift提供的扩展方法,顾名思义,可以得到成功地网络请求,忽略其他的 mapJSON()也是Moya RxSwift...4.配合HandyJSON 在实际应用过程中网络请求往往紧密连接着数据层(Model),具体地说,在我们的这个例子,一般我们需要建立一个类用来统一管理数据,然后把得到的 JSON 数据映射到数据层(Model...这里是为 RxSwift 的 ObservableType和 Response写一个简单的扩展方法 mapModel,利用我们写好的Model 类,一步就把JSON数据映射成 model。...数据类建立好之后,我们还需要为 RxSwift 的 Observable 写一个简单的扩展方法 mapObject,利用我们写好的model 类,一步就把JSON 数据映射成一个个 model。

1.9K20

【iOS】RxSwift官方Example4--Github注册(MVVM)

前言 这一篇,是一个仿Github注册的表单页面。官方针对这个例子,介绍了用RxSwift实现MVVM,一个是使用Driver 序列(针对UI界面的),另一个是Observable 序列。...其实就是一个很经典的注册表单界面: 输入用户名,检验用户名是否存在 输入密码,检验密码长度 输入确认密码,检验与上次输入的密码是否一致 注册按钮,当所有输入内容合法时,才能点击 MVVM的优点 以下摘自百度百科...视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 可重用性。...你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 独立开发。...Driver Driver是RxSwift专门用于处理UI的,相比Observable,它有以下特点: 不会发出Error 在主线程执行 自动添加 shareReplayLatestWhileConnected

79140

由JSON CSRF到FormData攻击

首先:你们必须知道CSRF攻击,如果不知道,那么这里是一个简短的介绍:CSRF是一种攻击,它迫使最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作。...首先:你们必须知道CSRF攻击,如果不知道,那么这里是一个简短的介绍: CSRF是一种攻击,它迫使最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作。...,使用常规HTML表单,只能通过XML HTTP请求或简单地通过AJAX请求到服务器, 但由于CORS策略我们不能这样做,除非服务器允许超过自定义的Origin和在响应为Access-Control-Allow-Credentials...现在让我们来看看现实生活的案例: 以下是发送到服务器以更改用户个人信息的JSON请求 现在,我们可以尝试如果改变Content-Type的application/json为text/plain,是不是还可以工作...这是最常见,最简单的表单提交类型。现在创建一个包含JSON数据中所有字段的HTML表单

1.7K20

iOS - RxSwift 项目实战记录

Moya/RxSwift // 为RxSwift专用提供,对Alamofire进行封装的一个网络请求库 ObjectMapper // Json转模型之必备良品 RxDataSources...一、自定义Section 在我们自定义的Model创建一个Section的结构体,并且创建一个扩展,遵循SectionModelType协议,实现相应的协议方法。...、网络请求等代码存放于ViewModel,让我们手中的ViewController瘦身。...可以看到我为Output添加了一个序列,类型为我们自定义的LXFSection数组,在Input里面添加了一个请求类型(即要请求什么数据,比如首页的数据) 我们通过 transform 方法将input...requestCommond用于请求数据 PublishSubject 的特点:即可以作为Observable,也可以作为Observer,说白了就是可以发送信号,也可以订阅信号 // 外界通过该属性告诉

2.9K41

iOS_RxSwift使用(文档整理)

整理总结了一下文档内容,方便自己查阅~ 一、RxSwift可以做什么?...可发出多个元素,也不共享 Driver:不会Error 且 mainThread监听 (可简化UI层代码,解决失败不能try again,后台返回,多次请求) Signal:与Driver相反...,在subscrible执行)详情 Binder:详情 不处理Error(测试环境:执行fataError,发布环境:打印ErrorLog) 确保绑定都在给定Scheduler上执行(默认:MainScheduler...:会发送订阅前的元素,可以设置前n个/前一段时间的 BehaviorSubject:订阅时,发送最新的元素/Error ControlProperty:UI控件属性,无Error,mainThread订阅监听...是序列 是序列 无论是否有观察者订阅,都使用资源(产生热能) 观察者订阅之前,不使用资源(不产生热能) 变量/属性/常量,点击坐标,鼠标坐标,UI控件值,当前时间… 异步操作,HTTP连接,TCP连接,

1.5K30

MVVM+RxSwift

ViewModel里面主要进行网络请求、业务处理等操作。网络请求的框架我们用的是Moya,因为它可以使我们的请求得到一个序列,然后我们才可以进行数据绑定。...因为在某些业务场景下我们需要保存它,比如在网络请求错误的时候,我希望页面还会继续显示之前有数据的状态,这时候我们就可以在网络请求错误的序列塞入我们之前保存的数据,这样页面还是显示原样,还有你注意没有这个属性是...ActivityIndicator:可以监听网络请求的状态从而改变loading的状态,具体实现在下面代码已经贴出。...这里的saveData是一个PublishSubject类型,可接收也可发送序列,因为Driver只能接收而不能发送。如果成功就去刷新页面。...Navigator的核心代码 总结 要搭建一个上述的MVVM项目,RxSwift,RxDataSources,Moya是必不可少的,并且你要会用RxDataSource创建UITableView数据源

1.4K20

RxSwift 系列(九) -- 那些难以理解的概念

但是这个sequence不再发送消息事件了,那么我们的监听也就没有什么存在的价值了,所以我们需要释放我们这些监听资源,其实也就是内存资源释放。...以下情况你可以使用Driver替换BindTo: 不能发出error; 在主线程监听; 共享事件; map 和 flatMap 何时使用 看了前面《RxSwift 系列(四) -- Transforming...,网络请求可能会发生错误,我们需要对这个请求过程进行监听,然后处理错误。...UIBindingObserver UIBindingObserver这个东西很有用的,创建我们自己的监听者,有时候RxCocoa(RxSwift对UIKit的一个扩展库)给的扩展不够我们使用,比如一个...,他的初始化方法,有两个参数,第一个参数是一个元素本身,第一个参数是一个闭包,闭包参数是元素本身,还有他的一个属性。

2.1K70

函数响应式编程框架RxSwift 学习——Subject

关于Subject的定义,在RxSwift的文档它是这样说的 A Subject is a sort of bridge or proxy that is available in some implementations...在RxSwift,主要有三类Subject: PublishSubject 它仅仅会发送observer订阅之后的事件,也就是说如果sequence上有.Next 的到来,但是这个时候某个observer...BehaviorSubject 当有observer在订阅一个BehaviorSubject的时候,它首先将会收到Observable上最近发送一个信号(或者是默认值),接着才会收到Observable...在我上一篇文章,说到了一个比较常见的一个应用场景,就是tableview滑动加载更多的数据。...page又被负责API请求的对象给订阅了,从而当page变化的同时开始自动请求数据。

68520

用Swift写一个响应式编程库

响应式编程是一种面向数据和变化传播的编程范式。 比如用户输入、单击事件、变量值等都可以看做一个,你可以观察这个,并基于这个做一些操作。“监听”的行为叫做订阅。响应式就是基于这种想法。...在响应式里面,我们监听请求,当请求完成时,观察者得到更新。...func fetchUser(with id: Int) -> Signal {} 发送网络请求就可以这样: fetchUser(with: "12345").subscribe({ }) 在完成 Signal...Signal 转换为另一个 Signal , 这在我们处理多个请求嵌套时就会很方便了。...还有我们对 Disposable 的处理也不够优雅,可以模仿 RxSwift DisposeBag 的做法。上面这些问题可以留给读者自己去思考了。(更多内容可以查看我的主页)

1K50

走进 RxSwift 之冷暖自知

实战小剧场 下面我随便举个例子,我们要完成的功能是发送网络请求,将返回的数据显示到一个 TableView 上。...-> Void func request(completion: CompletionHandler) { // ... } } 这是一个非常典型的网络请求,在回调处理返回数据...很明显,Variable 是个 HO,它其实是 BehaviorSubject 的一个封装,顺便说一下,RxSwift 的所有 Subject 都是 HO。...如何一眼区别 CO 和 HO 前面也说过了,不管是冷是热,它们都是 Observable,虽然我顺便提了几个 RxSwift 典型的 CO 和 HO,但如果是一个自定义的 Observable 呢,要如何区分它是冷是热呢...之前我在 走进 RxSwift 之观察者模式解释了Observable.empty的实现,虽然那是比较老的版本,不过核心原理是一样的。

2.3K10

用Swift写一个响应式编程库

响应式编程是一种面向数据和变化传播的编程范式。 比如用户输入、单击事件、变量值等都可以看做一个,你可以观察这个,并基于这个做一些操作。“监听”的行为叫做订阅。响应式就是基于这种想法。...在响应式里面,我们监听请求,当请求完成时,观察者得到更新。...func fetchUser(with id: Int) -> Signal {} 发送网络请求就可以这样: fetchUser(with: "12345").subscribe({ }) 在完成 Signal...Signal 转换为另一个 Signal , 这在我们处理多个请求嵌套时就会很方便了。...还有我们对 Disposable 的处理也不够优雅,可以模仿 RxSwift DisposeBag 的做法。上面这些问题可以留给读者自己去思考了。

86370

RxSwift核心逻辑的理解

这一篇文章全面解密 RxSwift核心流程 RxSwift这个优秀的框架,设计的api也是非常精简,让陌生的用户也能非常快速上手 1: 创建序列 2: 订阅序列 3:发送信号 // 1: 创建序列 _...= Observable.create { (obserber) -> Disposable in // 3:发送信号 obserber.onNext("Cooci -...下面是我的代码分析 分析代码: 1:创建序列的代码 Create 后面的 闭包A 里面有 3:发送信号,如果要执行 发送信号 ,必然要来到这个闭包A 2:我们执行 2: 订阅序列 创建了 闭包B 3:通过结果我们显然知道...猜测的真实性,我们开始解读源码来验证 PS: 说实话 RxSwift框架的源码的确比较复杂并且很多,很多基础薄弱或者耐性不够的小伙伴很容易放弃。..._subscribeHandler,从这句代码我们解惑了为什么我们的序列订阅的时候流程会执行我们 序列闭包,然后去执行 发送响应 发送响应的代码等会分析,这里还有一个比较重要的家伙 AnyObserver

1.1K31

解密RxSwift核心逻辑

RxSwift核心流程 RxSwift这个优秀的框架,设计的api也是非常精简,让陌生的用户也能非常快速上手 1: 创建序列 2: 订阅序列 3:发送信号 // 1: 创建序列 _ = Observable...下面是我的代码分析 分析代码: 1:创建序列的代码 Create 后面的 闭包A 里面有 3:发送信号,如果要执行 发送信号 ,必然要来到这个闭包A 2:我们执行 2: 订阅序列 创建了 闭包B 3:通过结果我们显然知道...猜测的真实性,我们开始解读源码来验证 PS: 说实话 RxSwift框架的源码的确比较复杂并且很多,很多基础薄弱或者耐性不够的小伙伴很容易放弃。..._subscribeHandler,从这句代码我们解惑了为什么我们的序列订阅的时候流程会执行我们 序列闭包,然后去执行 发送响应 发送响应的代码等会分析,这里还有一个比较重要的家伙 AnyObserver...总结:RxSwift的结构 1:就是序列感念 满世界都是序列 - 编码统一 ,随时随地享用 2:通过函数式思想吧一些列的需求操作下沉(把开发者不关心的东西封装) - 优化代码,节省逻辑 3:RxSwift

69210

【iOS开发】RxSwift入门:从Observable.create讲起

再说一下它跟Observable的关系,Observable发送的所有事件都是一个Event,同一个Observable发送的Event的泛型参数的类型肯定是一样的,就是说一个Observable不会即发送...以一个读取商品信息的网络请求为例,可以这样写: let someObservable = Observable.create({ (observer) -> Disposable...这跟OC时代用RACCommand做网络请求封装比较相似。将上面的Observable做为一个方法的返回值,放到ViewModel里面。在Controller里面调用方法,再订阅,流程就比较清晰了。...要记得一点:Observable发送的所有事件都是一个Event对象,即我们订阅一个Observable收到的任何事件都是一个Event 想看RACCommand写法的同学可以去看一下我的另一篇文章:...MVVM中使用RACCommand封装网络请求 如果文章对您有帮助,就关注一下点个赞吧,我会持续写一些实际开发遇到的问题,代码写法相关的文章。

72840

翻译翻译什么 tmd 叫“可读”?RxJS实现“搜索”功能

text.addEventListener('keyup', (e) =>{ var searchText = e.target.value; $.ajax({ // 发送请求...这个时候,只能献祭出终极解决方案:本篇主角 —— RxJS 了,其实不止有 JS 的 RxJS,与之对应的还有,RxJava、RxAndroid、RxSwift,它们都是处理异步编程的【核武器库】; RxJS...没错,依然不好懂 ZZZ 不如,换个角度来解释: RxJS 通常用【弹珠图】来表示“事件”,比如 map api 的弹珠图如下: switch api 的弹珠图如下: 当发出一个新的内部 Observable...时, switch 会从先前发送的内部 Observable 那取消订阅,然后订阅新的内部 Observable 并开始发出它的值。...即永远订阅最新的Observable; 那么:switchMap = map + switch ,示意如下: 结合理解,在本篇搜索示例,即用 Http.get(url) 所得 data 值作为事件的最新值

54210
领券