给 iOS 开发者的 RxSwift(一)

RxSwift 或许我们都听说过,但或许只知道 RxSwift 这个单词,长篇大论关于 RxSwift 的介绍往往使读者迷失在各种概念当中,却不知如何让它大展伸手。或许我们可以换一种姿势,一些应用场景会让我们产生共鸣,解决问题的方式由很多,为什么不找一种最优的呢?RxSwift也许会帮到你。

什么是 ReactiveX(Reactive Extensions)

  • An API for asynchronous programming
    with observable streams

通过可观察的流实现异步编程的一种API(不明白?嗯,看完所有的例子再读一篇)

  • ReactiveX is more than an API, it‘s an idea and a breakthrough in programming. It has inspired several other APIs, frameworks, and even programming languages.

ReactiveX 不仅仅是一种 API 那么简单,它更是一种编程思想的突破。它已经影响了其他 API,frameworks,以及编程语言。

它无处不在

它是跨平台的(RxJS,RxJava,RxNET),也就是说掌握 RxSwift 这种思想,学习其他的 Rx 系列的将非常简单。

先来个总结?还没开始就总结!

ReactiveX(Reactive Extensions)是通过可观察的流实现异步编程的一种API,它结合了观察者模式、迭代器模式和函数式编程的精华。RxSwift 是 ReactiveX 编程思想的一种实现,几乎每一种语言都会有那么一个 Rx[xxxx] 框架,比如 RxJava,RxJS 等。Rx 可以概括为:

  • 观察者模式 Observable:对某些数据流(很广,可以是一些事件等)进行处理,使其变成可观察对象(Observable)序列,这样观察者(observer)就可以订阅这些序列;
  • 操作符 Operators:然而对于订阅者来说(observer)某些选项(items)并不是自己需要的(需要过滤),某些选项(items)需要转换才能达到自己的目的;
  • 迭代模式 Iterator:这样集合或者序列中的值就可以进行遍历了。
  • 调度器 Scheduler:为了提升用户体验,或其它目的,有些操作需要放到特定的线程去执行,比如 UI 操作需要放到主线程,这就涉及到了调度器。

所以 Rx 可以这样概括,Rx = Observables + LINQ + Schedulers,其中 LINQ(Language Integrated Query)语言集成查询,比如那些操作符号。

先来看个例子:修改用户昵称

用户昵称必须由3-10个字符组成,用户名不合法时显示提示(昵称由3-10个字符组成),且修改按钮不可点击。

func registerRx() {
    let nickNameValid = nickNameTextField.rx.text.orEmpty
        .map { (text) -> Bool in
        let tLength = text.characters.count
        return tLength >= 3 && tLength <= 10
        }
        .share(replay: 1)

    nickNameValid
        .bind(to: alertLabel.rx.isHidden)
        .disposed(by: disposeBag)

    nickNameValid
        .bind(to: changeButton.rx.isEnabled)
        .disposed(by: disposeBag)
    changeButton.rx.tap
        .subscribe { (next) in
         print("修改昵称成功!")
        }
        .disposed(by: disposeBag)
}

图片发自简书App

知识点说明

  • 安装 RxSwift 时会安装 RxSwift(对ReactiveX的实现) 和 RxCocoa(对iOS cocoa 层的实现);
  • orEmpty:主要使 String?类型变为 String类型;
  • map:它属于 Rx 变换操作中的一种,主要对 Observable 发射的数据应用一个函数,执行某种操作,返回经过函数处理过的 Observable。Observable 可观察的对象,用来被观察者(observer)订阅,这样observe可以监听Observable发出的事件;
  • share(replay: 1):只允许监听一次;

到这里,还不了解基本概念?

Observable

Observable 直译为可观察的,它在 RxSwift 起到了举足轻重的作用,在整个 RxSwift 的使用过程中你会经常与它打交道。如果你使用过 RAC ,它如同 Signal一样。RxSwift 中关键点就是在于如何把普通的数据或者事件变成可观察的,这样当某些数据或事件有变化的时候就会通知它的订阅者。

那如何能够让某些数据或事件成为 Observable 呢?
RxSwift 中提供很多种创建 Observable 创建方法。比如:Fromneverempty和 create等,更多创建方法。订阅者可以收到 3 个事件,onNextonError和 onCompleted,每个 Observable 都应该至少有一个 onError或 onCompleted事件,onNext表示它传给下一个接收者时的数据流。

func create() {
       let observable = Observable<String>.create { (observer) -> Disposable in
        observer.onNext("Hello Lefe_x, I am here!")
        observer.onCompleted()
            return Disposables.create()
        }

        observable.subscribe(onNext: { (text) in
            print(text)
        }, onError: nil, onCompleted: {
            print("complete!")
        }, onDisposed: nil).disposed(by: disposeBag)
    }

juli

Lefe_x 经常刷微博,刚开始时他并不刷微博,别人也不会看到他发的内容(这时他是不可订阅的)。某天,Lefe_x 想让自己学到的知识能帮助更多的同学,他就注册了微博,开始了刷微博之旅(变成了可订阅的 Observable),这样别人就可以关注他(订阅)。慢慢地,越来越多的人开始关注他,这样当他发微博(事件流)的时候,它的粉丝就可以被提醒(通知订阅者),这些提醒有不同功能,比如有的是提醒 Lefe_x 发布了新微博,有的提醒微博被转发了(相当于 onNextonError和 onCompleted事件)。

Operators 操作符

Observable 创建后,可能为了满足某些需求需要修改它,这时就需要用到操作符。RxSwift 提供了非常多的操作符,当然不必要一一掌握这些操作符,使用的时候查一下即可,当然常见的操作符必须要掌握,比如 mapflatMapcreatefilter等。这里查看更多

再来个例子放松下:

这个例子主要把查找数组中的字符串 Lefe_x,并显示到 Label 上。

override func viewDidLoad() {
    super.viewDidLoad()
    DispatchQueue.global().async {
        self.from()
    }
}

func from() {
    Observable.from(["Lefe", "Lefe_x", "lefex", "wsy", "Rx"])
        .subscribeOn(MainScheduler.instance)
        .filter({ (text) -> Bool in
            return text == "Lefe_x"
        })
        .map({ (text) -> String in
            return "我的新浪微博是: " + text
        })
        .subscribe(onNext: { [weak self] (text) in
            self?.nickNameLabel.text = text
        })
        .disposed(by: disposeBag)
}

运行结果为:

图片发自简书App

呀,这不是前几天有人写过的吗?没错,那是前几天发的一个 #iOS知识小集# ,不过哪里只是一个总结,没有详细的说明。这里主要说一下调度器 (Scheduler)。

Scheduler 调度器

如果你想给 Observable 操作符链添加多线程功能,你可以指定操作符(或者特定的Observable)在特定的调度器(Scheduler)上执行。对于 ReactiveX 中可观察对象操作符来说,它有时会携带一个调度器作为参数,这样可以指定可观察对象在哪一个线程中执行。而默认的情况下,某些可观察对象是在订阅者订阅时的那个线程中执行。SubscribeOn 可以改变可观察对象该在那个调度器中执行。ObserveOn 用来改变给订阅者发送通知时所在的调度器。这样就可以使可观察对象想在那个调度器中执行就在那个调度器中执行,不受约束,而这些细节是不被调用者所关心的。犹如 GCD 一样,你只管使用,底层线程是咋么创建的,你不必关心。

写在最后

下一篇打算写一些关于 Rx 做数据绑定和网络层的交互。

参考

作者:Lefe
链接:https://www.jianshu.com/p/35ed80a05952
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/feng9exe/p/9004647.html

时间: 2024-08-01 08:09:15

给 iOS 开发者的 RxSwift(一)的相关文章

iOS开发者程序许可协议

请仔细阅读下面的许可协议条款和条件之前下载或使用苹果软件.   这些条款和条件构成你和苹果之间的法律协议. 目的 你想使用苹果软件(如下定义)来开发一个或多个应用程序(如下定义)Apple-branded产品运行iOS. 苹果愿意授予您有限的许可使用苹果软件开发和测试您的应用程序在本协议规定的条款和条件. 开发的应用程序在此协议下可以分布在四个方面:(1)通过应用程序商店,如果选择苹果,(2)通过VPP / B2B项目网站,如果选择苹果,(3)在一个有限的基础上使用注册设备(如下定义),和(4)

麦子学院干货 | iOS开发者需要的九大设计工具

麦子学院[www.maiziedu.com]干货 | iOS开发者需要的九大设计工具 1.AppCooker AppCooker是一款方便的iPad应用.它能够提供可点击的原型模板,集合了所有需要编码或渲染的重要部件,并且还可以帮助开发者无需任何代码编写就能够构思.设计和测试iOS应用.目前AppCooker在App Store上的售价为19.99美元. 主要功能: 全功能模型编辑器拥有所有iOS UI部件 位图图画.矢量形状和文本工具 带有链接的整体屏幕视图 收存箱和Box支持云服务 2.Sk

iOS 开发者旅途中的指南针 - LLDB 调试技术

文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在指定位置进行输出,来定位某些节点的变量内的取值: 12345 let result = parseJSON("[1,2,3]");print(result); result = parseJSON("error");print(result);4 相信我们大家看到类似这

[转]如何通过 App Store 审核(iOS 开发者经验分享)

CocoaChina交流社区曾经发起一个主题讨论,关于iOS开发者遇到审核失败的原因及解决办法的,有价值的回复内容如下: wubo9935 App中设计的图标与Apple原生图标类似,Apple原生图标有专利保护,并且在Design Guideline里面规定,App的图标不能与Apple图标雷同,如iTunes,App Store, iPod等的图标.若出现雷同App将被拒. 逐风 App的设置界面.按钮使用了类似iPhone的操作方式以及icon的圆角设计 -> 重新设计… App的年龄设置

iOS 开发者必不可少的75个工具

原文出处: Ben Scheirman 译文出处: Njuxjy 如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将向你展示一份关于各种工具的长长的列表.其中一些我每天都用,其他的我看情况使用.如果你还有更多的工具想展示在这个列表里,可以跟我留言哦亲

iOS开发者计划申请之企事业单位开发者证书——申请模版

技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 附上iOS开发者计划申请之企事业单位开发者证书,申请模版 另外还有证书申请的详细步骤 http://www.cnblogs.com/ChenYilong/p/3556208.html#2936063 总共大概花了2周多的时间,虽然波折了好几次,不过比我预想的好的多,苹果开发者技术服务支持提供的很给力,每次发邮件都会有回应,打电话也有耐心的解答.

12个ios开发者必备效率工具

这里推荐12个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试.上架以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker 不仅是一个创建原型的优秀工具,它提供的许多功能还可以帮助你将程序发布到App store中.它集成了Dropbox,Box.net和photo roll,你可

iOS开发者证书-详解

iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密. 对称密钥加密 对称密钥加密(Symmetric-key algorithm)又称为对称加密, 私钥加密, 共享密钥加密. 这类算法在加密和解密时使用相同的密钥. 例如: 最常见的应用场景 - 系统登陆. 要成功登陆系统, 你必须输入正确的密码, 这密码是唯一的, 是与创建时一样的. 同样 的,

一个iOS开发者对tvOS SDK的初探

http://www.cocoachina.com/ios/20151001/13652.html 作者:Chris Wagner原文地址:tvOS SDK: An iOS Developer’s Initial Impressions 在Walter Isaacson编写的<Steve Jobs>的最后一章中,Steve说过“我最终实现并让它拥有了你们能想象到的最简单的用户界面”.当时他指的就是Apple TV. Steve不幸离世已经过去很久了,但是人们一直翘首以盼着这款产品.就在昨天20