我自己的感受是,虽然学习曲线比较陡峭,学习成本很高,一旦掌握了其开发技巧,收获要比想象中多,值得去学习并实践的框架。 接下来先看一个最常用的例子,swift环境中搭建一个简单的tableView。...在RxSwift中,不再需要去挨个遵循tableView的各种代理方法,直接上修改后的代码 class ViewController: UIViewController { lazy...结构体中的数据需要被RxSwift包装成了Observable信号。...在RAC中使用的组合式销毁来集中管理销毁RACSignal,而在RxSwift中与RAC类似的使用到了DisposeBag来实现Observable的集中销毁管理。...上手写代码的过程中,发现RxSwift的编译器代码提示在Xcode下实在是不友好,代码提示有时完全失效,只能手动写入其实现的方法与参数 现在了解了RxSwift框架的基本使用,在RxSwift的官方链接中也有
网上已经有很多文章介绍reactive和RxSwift,也有很多教程教大家怎么处理Rx中的各种状况(文本后面会放一些相关链接)。...所以这里不打算再写一篇教程去解释streams和observables的原理。我想提供一个简单、清晰、不涉及理论知识的总结,介绍用RxSwift可以做什么,以及为什么要用RxSwift。...假如你有一个app,需要用户在text field中输入他们的名字。用「"Hello, \(Name)"」来做问候。很简单的需求,对吧。...当用户点击一个按钮,app会检测到这是UIControlEvent中的.touchUpInside。...如果你用的是storyboards,在创建@IBAction的时候就会看到.touchUpInside。在这个例子中,不需要考虑按钮的点击事件。
// 对 UIKit Foundation 进行 Rx 化 NSObject+Rx // 为我们提供 rx_disposeBag Moya/RxSwift // 为RxSwift...) 大功告成,接下来说说section序列的产生 ViewModel的规范 我们知道MVVM思想就是将原本在ViewController的视图显示逻辑、验证逻辑、网络请求等代码存放于ViewModel中...,让我们手中的ViewController瘦身。...,不然会不方便阅读和理解 } } 接着我们在ViewController中初始化我们的input,通过transform得到output,然后将我们output中的sections序列绑定tableView...(rx_disposeBag) 五、在ViewController中初始化刷新控件 为tableView设置刷新控件,并且在创建刷新控件的回调中使用output的requestCommond发射信号 tableView.mj_header
本文是基于 iOS - RxSwift 项目实战记录 所述,如果你还未阅读过,建议你最好还先阅读一遍,并下载Demo熟悉一下 : ) LXFBiliBili 前言 MVVM的模式中,多出了ViewModel...这个角色,将逻辑处理、网络请求等繁杂操作中ViewController中抽离出来,ViewController得以瘦身。...结合RxSwift架构,我们一般就会在ViewModel中定义一个input收集繁杂操作所需的信息,通过一个transform方法将input作为参数传入,进而得到一个output供controller...在使用RxSwift开发时会大量的使用到这种形式,其中就包括我们的网络请求。...结合 iOS - RxSwift 项目实战记录 中所述的“MJRefresh在RxSwift中的使用”,在output中定义了一个变量 let refreshStatus = Variable<LXFRefreshStatus
RxSwift使用备忘 RxSwift 常用方法使用,这里记录一下。...throttle 和 debounce 的区别: throttle 每隔固定时间调用 debounce 事件停止后隔多少秒调用 所以,如果需要实现输入中搜索,使用 throttle fileprivate...disposed(by: disposeBag) RxSwift 实现代理 scrollView 代理 override func viewDidLoad() { super.viewDidLoad...endRefreshing() } }) .disposed(by: disposeBag) } RxSwift 实现通知 override...) } RxSwift整合网络请求 flatMapLatest,处理多个任务有依赖关系的情况,避免回调地狱 /// 通过用户名和密码获取用户信息 API.token(username: "beeth0ven
RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable。...Combination Operators在RxSwift中的实现有五种: startWith merge zip combineLatest switchLatest startWith 在Observable...你可以在上面的例子中再添加几个.startWith()试试。 merge 将多个Observable组合成单个Observable,并且按照时间顺序发射对应事件。更多详情 ?...subject2.onNext("③") zip 将多个Observable(注意:必须是要成对)组合成单个Observable,当有事件到达时,会在每个序列中对应的索引上对应的元素发出。...(ps:之前版本的RxSwift好像最多只能组合8个Observable)更多详情 let disposeBag = DisposeBag() let subject1 = PublishSubject
本文主要介绍个人在 Swift 项目开发中的一些实践经验,供大家所借鉴或者探讨。 提高开发效率,降低 Bug 发生率,是我们每个开发所追随的目标。...登陆注册模块(Carlisle) 包含用户注册、登陆、找回密码等功能,主要是用户权限相关的管理界面,登陆注册模块是参考RxSwift官方 Demo 简单修改完成的。...View: 相关自定义的 View ViewController: 对应的 ViewController ViewModel: 对应的 ViewModel /// 界面第一次初始化 let _ =...RxSwift的使用 ---- 项目中大部分的逻辑处理是借助 RxSwift 实现的响应式编程,当界面上的每个操作都会转换为一个信号然后通过对信号的各种加工网络请求,到返回的数据 JSON 解析以及错误对象的处理...,通过 RxSwift 的一个很简单的 Api:withLatestFrom就能实现数据重新加载,而不需要记住各种复杂的参数。
Observable介绍 Observable类是RxSwift框架的基础。...) //disposeBag为创建的垃圾包 接触过RAC系列的,会发现RxSwift语法结构非常相似。...打印结果 在Observable对象中,可以根据三种事件创建自定义的可观察序列。在可观察序列中,分为有限观察序列与无限观察序列。...) Observable订阅与销毁 与 RAC 的订阅信号方法非常类似,使用过程中是需要在需要订阅 Observable 的地方调用 subscribe 方法即可。...在RxSwift中每一个订阅都是唯一的,而且没有一个类似NotificationCenter通知机制 default 这样的全局单例对象。当没有订阅者时,Observable 对象不会发送通知。
上面的subscription不论是在哪个线程中监听,就算在主线程中调用的dispose()方法一样会销毁资源。...error, Driver序列的监听只会在主线程中。...以下情况你可以使用Driver替换BindTo: 不能发出error; 在主线程中监听; 共享事件流; map 和 flatMap 何时使用 看了前面《RxSwift 系列(四) -- Transforming...和flatMap在swift中的作用是一样的。...UIBindingObserver UIBindingObserver这个东西很有用的,创建我们自己的监听者,有时候RxCocoa(RxSwift中对UIKit的一个扩展库)给的扩展不够我们使用,比如一个
前言 本篇文章将要学习RxSwift中过滤和条件操作符,在RxSwift中包括了: filter distinctUntilChanged elementAt single take takeLast...takeWhile takeUntil skip skipWhile skipWhileWithIndex skipUntil filter 在Observable序列中只发出满足过滤条件的事件。...(onNext: {print($0)}).disposed(by: disposeBag) 用法二:检测Observable序列发射的元素里面是否包含多个指定的元素,如果有多个或者没有,会报错。...(by: disposeBag) 打印结果: 2 3 takeWhile 只处理满足条件的事件。...(by: disposeBag) 打印结果: 3 4 5 6 skipWhile 跳过满足条件的事件,只要遇见不满足条件的事件,则该事件以及之后的事件(不管是否满足条件)都会发出。
前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一个新的...disposed(by: disposeBag) 运行结果: [1, 2, 3, 4, 5] reduce 使用一个初始值和一个操作符,对Observable序列中的所有元素进行累计操作,并转换成单一事件信号...将两个Observable序列合并成一个Observable序列,当一个Observable序列中的所有元素成功发射完成之后,才会发射另一个Observable序列中的元素。...不好理解,举个例子: let disposeBag = DisposeBag() let subject1 = BehaviorSubject(value: "?")...subject2发射的这些事件都会被忽略,但是又会接收subject2发射的最后一个事件,因此会打印onnext(?)。 致谢 如果发现有错误的地方,欢迎评论,感谢!
双向绑定在我们的开发中有时候也是会用到的,比如MVVM中,ViewModel绑定到一个UI控件,当ViewModel发生变化时,控件跟着变化,而当我们改变控件值时,ViewModel也跟着变化。...[Data binding] RxSwift 使用RxSwift可以很简单的实现双向绑定,我们定义一个ViewModel: struct UserViewModel { var userName...userModel.userName.asObservable().bind(to: textField.rx.text).disposed(by: disposeBag) textField.rx.text.orEmpty.bind...(to: userModel.userName).disposed(by: disposeBag) 此时就实现了双向绑定,我们改变其中一个值,另外一个值也会跟着改变。...也可以使用RxSwift示例代码中给的Operators.swift里面实现的Operator ""来做双向绑定,这种方法更加简洁 _= textField.rx.textInput self.userModel.userName
在刚开始接触RxSwift框架时,最感到迷茫的就是着手用该框架写出我们自己的项目。个人感觉,在对RAC与RxSwift的基本原理有了一定认识之后,带着目的与问题去直接动手写代码是最快的学习路径。...这篇先探究一下常用的UI控件在RxSwift框架中,是怎样运作并最终实现想要的效果 首先是最基本的 lable、textField 与 button 。...//分别初始化一个 button、一个 lable、一个textField,以及一个Rx中的垃圾回收包 DisposeBag let disposeBag = DisposeBag()...thirdBtn.backgroundColor = UIColor.red }).disposed(by: disposeBag) } 上面在上面代码中,drive() 方法与...比如根据观察者的属性变化同时改变多个UI控件状态 而且,在 button 按钮点击的订阅方法中,改变了 button 自己的属性,那么在订阅方法中添加 [weak self] 就可以防止循环引用出现。
前言 从今天起,我把自己学习RxSwift的官方Example时的感想写下来,或许对有疑惑的人有帮助吧。传送门 加法篇 ?...let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() self.title...的情况,也就不需要考虑String为nil的情况。在Rxswift中,对于所有字符串的监听都是转为orEmpty处理的 combineLatest 其实将可观察序列中,将最新的序列组合起来处理。...(to: confirmButton.rx.isEnabled) .addDisposableTo(disposeBag) 这里使用到时的bind函数,看一下官方注释: /**...在MVVM中,该方法主要用于View和ViewModel之间的绑定。
这次打算单独将 tableView 在 RxSwift 框架中的使用整理成一篇文章。...tableView 在日常开发中是接触到最多的UI控件之一,在 RxSwift 框架中也帮我们封装好了关于 tableview 的使用方法。...自从接触了 RxSwift 的框架,关于 tableview 基本就不用再繁琐地去实现系统提供的各种代理方法,几行代码搞定关于 tableview 的一切。...的 DataSource 与 delegate 协议,RxSwift已经帮我做好了工作。...}.disposed(by: disposeBag) TableView中的响应事件。
前言 之前的几篇博客算是入门篇,那么这篇就是RxSwift的实战篇。由于对RxSwift的认识还不够深刻,所以项目中没有使用MVVM模型,以及编程思想也还没转变过来。...该项目是参考https://github.com/kLike/ZhiHu-RxSwift实现的,最大的实现区别就是,我用的是纯代码实现,还有对网络请求的封装。...最后,还是非常感谢该作者源码的贡献~ 框架介绍 框架 说明 Moya 对Alamofire的封装 Moya/RxSwift 针对RxSwift的Moya扩展 Kingfisher 喵神的网络图片加载库...方法中,监听section的变化,刷新条件是:当滚动到最后一个section的第一个元素时,加载更多数据 func tableView(_ tableView: UITableView, willDisplay...那么针对上拉刷新,我是这样封装的,在我的MPApiService服务层中,定义了如下方法: func loadMoreHomeNewsList(date: String) -> Observable<MPStoryListModel
前言 本篇文章将要学习RxSwift中四种转换操作符: map flatMap flatMapLatest scan map 通过使用一个闭包函数将原来的Observable序列转换为一个新的Observable...let disposeBag = DisposeBag() Observable.of(1,2,3).map({return 10 * $0}).subscribe({print($0...会按时间顺序接收两个序列发出的元素。...= 100 打印结果: 80 85 90 95 100 flatMapLatest flatMapLatest同flatMap一样,也是将一个序列转换为另一个序列,flatMapLatest只会从最近的序列中发出事件...) 打印结果: 12 112 1112 致谢 如果发现有错误的地方,欢迎评论,感谢!
今天就介绍一下前段时间写的一个 demo,主要功能是扫描附近的蓝牙设备,显示相关信息,点击后可以连接设备,并获取更多信息。对 RxSwift 及 BLE 感兴趣的同学可以看看,或有所得。...我曾一度想着用 RxSwift 去包装一下 CoreBluetooth,后来发现已经有人做了这件事了,于是就想先写个 demo 看看靠不靠谱。Demo 在这里。...扫描设备的整个流程大致是这样的: 筛选蓝牙状态,将除.PoweredOn之外的状态过滤掉 扫描设备 筛选设备,将已出现过的设备过滤掉 将扫描到的新设备添加到设备列表中 用设备列表构建一个dataSource...,并与tableView绑定 将资源添加到disposeBag中,以待统一回收处理 这个过程用 Rx 的风格来写大概是这样的: func bindDataSource() { manager.rx_state...subscribeNext { self.tableView.deselectRowAtIndexPath($0, animated: true) } .addDisposableTo(disposeBag
整理总结了一下文档内容,方便自己查阅~ 一、RxSwift可以做什么?...RxSwift已实现的: view.isHidden button.isEnable label.text imageView.image … 最基本的创建方式:Observable.subscrible...error.localizedDescription)") }, onCompleted: { print("任务完成") }) 特征观察者: AnyObservable:可描述任意一种观察者(定义一个回调,在subscrible中执行....subscribe(onNext: { temperature in print("高温:\(temperature)度") }) .disposed(by: disposeBag...序列计算资源通常在所有订阅的观察者之间共享 通常为每个订阅的观察者分配计算资源 通常有状态 通常无状态 参考: RxSwift中文文档 Hot and Cold Observables
RxSwift Subject共分为AsyncSubject、BehaviorSubject、PublishSubject、ReplaySubject。...AsyncSubject 一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值。它会把这最后一个值发射给任何后续的观察者。...,然后继续发射其它任何来自原始Observable的数据。...Observable的数据发射给观察者。...,不然会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。
领取专属 10元无门槛券
手把手带您无忧上云