Tag: Rx

第1部分-RxSwift简介

RxSwift是Swift的被动扩展。 反应性扩展是观察者模式,迭代器模式和函数式编程的最佳创意的结合。 反应性扩展适用于Java,Scala,C#,C ++,JavaScript,Python,Clojure,Kotlin等。 RxSwift的编程模型类似于针对其他语言存在的反应式扩展,并且不止一组API。 这是一种构建响应,弹性,弹性和消息驱动的应用程序的新方法。 什么是反应式编程? 反应式编程是使用异步流或可观察序列(或简单的序列)进行编程。 它涉及流,其转换以及随之而来的绑定。 状态更改/新数据作为流传递,您可以观察和处理。 任何事物都可以是一个流:变量,事件,属性,请求/响应等。您可以收听任意数量的流并做出反应。 仅仅观察流是没有用的。 提供了用于转换任何这些流的工具。 您可以将任何这些转换链接起来,然后完全创建一个新的流。 并且,您可以将流绑定到属性,UI元素等。这使得编写和构建异步程序更加容易。 考虑以下代码: var health = 100.00 var playerCritical = health <= healthCutoffValue 如果playerCritical {//做某事} else {//做另一件事} 在此,变量playerCritical取决于健康状况是否小于临界值。 我们检查播放器是否很关键,并根据它进行一些工作。 但是,当玩家稍后在游戏中变得至关重要时,会发生什么呢? 也许,当播放器很关键时,您需要执行一段代码。 这就是反应式编程的用处 。您可以订阅playerCritical,并且当值更改时,将传递当前的流(或值),并在达到临界值时执行代码。 看看程序的数据流变得多么简单。 并且如前所述,任何东西都可以是流。 这只是一个简单的示例,但是在以后的系列中,我们将看到有关Rx的全部功能以及特定于iOS / macOS开发的更多内容。 反应式编程的好处 那么,Rx有什么好处? 为什么要在项目中使用它? Rx使您可以使用不可变的定义和纯函数以可靠的可组合方式处理流的快照。 您可以使用自己的处理程序轻松地将程序组成清晰的输入/输出函数 Rx帮助构建异步程序以对新数据/事件做出反应。 它使您可以编写高性能的代码来处理大量的流/事件。 使用提供的工具,您可以轻松编写高度交互的应用程序 可以很容易地推断出异步程序的功能以及处理程序对异步流的工作方式。 数据流清晰,您可以轻松理解代码块的工作方式 您可以轻松管理整个应用程序的状态。 Rx提供了在各种异步流之间共享状态的工具-如果您想 用Rx编写的代码非常具有说明性,因为定义是不可变的,并且只有流随时间变化,从而减少了副作用 Rx轻松让您绑定到UI元素,以更少的工作始终代表最新的应用程序状态 […]

使用RxSwift在视图控制器之间进行通信

如果您仍然不确定如何开始使用RxSwift,那么本文适合您。 我已经阅读了很多有关RxSwift的文章,但是从了解理论到实际利用该知识是一条很深的弯路。 在本文中,我们将创建一个使用RxSwift的非常简单的iOS应用程序。 我们将使用RxSwift的概念并将其应用到此应用程序中。 我将跳过RxSwift的基础知识,因为有许多精美的文章对其进行了解释。 作为参考,您可以在这里看看。 这是塞巴斯蒂安·博尔特(Sebastian Boldt)a的一篇可爱的文章。 我们将在此应用程序中采用一个非常基本的方案,即使视图控制器使用RxSwift进行通信。 让我们开始吧… 基本设定 在Xcode中创建一个新项目,并为该项目初始化pod,然后在pod文件中添加以下内容。 替换YOUR_TARGET_NAME ,然后在Podfile目录中键入: $ pod安装 快速转发…。 添加一个新的View控制器(我将其命名为N ewViewController ),以便您的主故事板如下所示: 当您点击更改背景按钮时,它将打开新的视图控制器,而当您点击NewViewController上的任何按钮时,它将更改MainViewController的颜色。 通过已建立的可可模式进行交流 如果您使用已建立的可可模式来构建它,那么下一步将是添加委托模式,以便我们的N ewViewController可以与M ainViewController对话。 通过可观察对象进行通信 打开您的N ewViewController,将以下变量添加到您的视图控制器类中: 在这里,我们创建了一个名为selectedColorSubject的Subject 。 这将发出选定的颜色,并发出一个名为selectedColor的Observable,它公开了可观察的主题。 要了解主题和可观察对象,请参阅 上面 提到的 链接 。 我们将添加一个名为changeColor的函数,当按下任意按钮时,它将负责发出新的颜色值,一旦发出该颜色值,我们应导航回到上一屏幕。 我们的函数如下所示: selectedColorSubject.onNext(color)发出新的颜色值,然后我们向后导航。 确保我们的按钮动作事件调用此函数 现在,我们的视图控制器如下所示: 现在转到我们的mainViewController 在按钮操作事件中添加以下代码 当我们点击changeColorButton时,我们导航到NewViewController 。 如我们所见, NewViewController中的selectedColor变量返回一个 类型Observable,因此我们可以订阅该序列。 这样,可观察对象发出的任何值都可以在我们的MainViewController上捕获。 您可以将其视为简单的KVO。 欢呼!! 我们已经完成了第一个RxSwift驱动的应用程序。 Github上的源代码。

带有RxSwift的MVVM登录屏幕

如何将MVVM用于与RxSwift绑定的经典登录屏幕? 这就是我们的方法..(歌曲♩♪♫♬) 让我们玩! ..但首先,什么是MVVM? 你应该在这里看看.. Swift中的MVVM – Artsy Engineering 模型视图ViewModel已成为我在iOS上编写应用程序的默认方式–它使编写iOS应用程序变得很有趣。 我写了…… artsy.github.io 对于RxSwift? 您应该在这里找到所有提示和技巧https://github.com/ReactiveX/RxSwift 所有我们需要的.. 6个步骤 .. !! 现在..让我们开始: 1-模型 我们创建一个使用用户名和密码登录的模型 然后,我们需要创建将处理此模型的viewModel .. 2-FieldViewModel 我们定义此协议VSFieldViewModel来表示条目数据字段(在我们的示例中,我们有emailField和passwordField) 我们使用一些属性来描述字段,例如title和errorMessage 然后,我们定义observables( 变量值:Variable )以在需要时处理和更新用户界面,在本例中,字段值和errorMessage是稍后绑定的变量。 我们定义一个validate()函数来使用定义的模式来validate()数据 我们添加扩展名,以使用一些实用程序方法来调整字符串或有效模式的有效大小(以后用于有效的密码和电子邮件输入值) 3-密码字段viewModel 除了基本的FieldViewModel外,我们还添加了另一个协议以自定义密码输入的类型(安全文本) viewModel定义validate()方法(字符串输入stize) 我们对下一个viewModel进行相同操作。 4-电子邮件字段viewModel 这里的viewModel定义变量和自定义模式以验证输入值(电子邮件模式格式:xx@xx.xx) 如您所见,某些变量可以为空(甚至为nil),例如errorMessage ,该条目应在无效输入后进行更新 现在..我们应该创建我们的控制器viewModel,它将处理下面的这些字段。 5-登录视图模型 在这个viewModel中,我们将model emailFieldViewModel用来处理电子邮件数据的字段 passwordFieldViewModel用于处理密码数据的字段 validForm()验证所有输入数据 disposeBag附带的disposeBag来管理内存 isLoading isSuccess和errorMessage是由控制器管理并用于绑定UI的变量RxSwift 用于调用身份验证服务的signin()方法 我们从viewModel字段使用模型电子邮件和密码提出了请求 我们在响应时更新可观察对象以处理UI,首先更新isLoading状态,然后在成功更新isSuccess状态时更新 相同的错误时,我们将错误消息放在errorMessage 6-最后! 控制器 ViewController将配置UI和viewModel之间的绑定 […]

自动进行复杂的表格视图状态更改

这不是我的编程博客,但我无法抗拒发表此帖子。 我想为正在处理复杂(尤其是动态)表视图布局的iOS程序员提供帮助。 我也喜欢Kitchen Stories应用程序,很高兴看到他们在iOS开发中发表的帖子。 他们做登录屏幕的方式对我来说似乎很棒。 不过,还有改进的空间。 处理动态布局可能很困难。 这就是为什么发明了诸如响应式功能编程 (或FRP)之类的技术的原因。 如果您不知道什么是FRP,我建议您先看Ash Furrow的精彩演讲。 基本思想是,您以称为Observable 的值流的形式定义所有内容。 它可以包含任何内容:用户输入的文本,API的响应,通知。 您可以通过组合和绑定这些可观察对象来编写代码。 这些硬布局的一种情况是动态表视图。 关于它们的讨厌的事情是表具有状态 。 这意味着,如果要对表进行更改(并且希望这些更改看起来很整洁),则必须手动删除并插入行和节。 想象一下,您的表有很多状态。 您必须为状态之间的每个过渡指定插入和删除。 kes 厨房的故事做出了正确的决定,并使用了一个库来帮助他们自动计算两种状态之间的差异。 让我印象最深的一件事是,他们已经定义了声明式的状态,但仍然以命令式的方式对他们的观点进行操作。 但是,为什么不更进一步呢? 为什么我们必须编写所有这些deleteRowsAtIndexPath ? 我将使用RxSwift和RxDataSources的功能来实现一个解决方案。 第一个是Swift中FRP的实现,第二个是使用表视图和集合视图执行复杂操作的库。 给我看看代码! 好的,首先让我们在表格视图中显示一些东西 。 如果只想显示相同的数据会更容易,但是在这种情况下,我们必须对其进行动画处理,因此我们将不得不编写一些样板来定义我们的部分。 是时候弄脏我们的双手了! 是的,它有效! 我保证,我们仍然没有更改tableView,但是我们真的很接近。 我们现在要做的是1)定义状态 表视图中的2)提供了在它们之间切换的方法,3)将状态绑定到我们的表示形式。 做吧,这很容易! 首先是状态。 看起来确实如此! 但是等等,动画不是我们想要的。 让我们修复它。 看起来更好。 我们还希望显示正确的按钮标题,因此我们也要这样做以提高我们的反应能力。 是的,它有效! 恭喜,我们做到了。 在枚举中定义状态有一件很棒的事情:如果添加更多状态,则也将不得不更改变量定义,并且您不会错过任何事情。 您可以在这里做很多事情。 我们没有更改注册/登录按钮的标题,可能应该使用关联的值来完成,因此我们的枚举不再具有原始值。 我还将在实际应用程序中使用Drivers而不是Observables (它是用于开发UI的特殊Observable,您可以在此处阅读有关它们的信息)。 另外,您可以实施即时表单验证并相应地启用/禁用按钮。 使用FRP是一项非常容易的任务! 在这个简单的教程中,Rx似乎是一个过大的功能,但是我可以向您保证,我正在做非常复杂的表视图并进行了许多更改,直到使用RxDataSources时我才失败。 […]

RxSwift主题

将新值添加到可观察值? 向主题问好。 开发应用程序时,通常需要在运行时将新值手动添加到可观察对象上,并将其发送给订阅者。 我们想要的是既可以观察又可以充当观察者的东西。 这称为主题 。 主体既充当可观察者又充当观察者。 他们可以接收.next事件,并且每次接收到事件时,它都会转身并将其发送给其订户。 RxSwift中有四种主题类型 PublishSubject :开始为空,仅向订阅者发出新元素。 BehaviorSubject :从初始值开始,然后将其或最新元素重放给新订户。 ReplaySubject :使用缓冲区大小初始化,并将保留最大大小的元素的缓冲区并重播给新订户。 BehaviorRelay :包装BehaviorSubject,将其当前值保留为状态,并仅向新订阅者重播最新/初始值。 发布主题 让我们创建一个PublishSubject,在上面添加一些订阅者,并在运行时添加一些值。 请记住,PublishSubject会向订阅者发出新的元素,因此,为了使订阅者获取值,订阅之后必须发生.onNext事件。 输出: 第一:下一个(1) 第一:下一个(2) 第一:下一个(3) 第二:下一个(3) 第一:下一个(4) 第二:下一个(4) 第二:下一个(5) 第三名:下一个(5) 有道理吧? 订阅者等待.onNext事件以获取值。 订阅后,订阅者将从PublishSubject接收值,直到订阅被释放。 行为主体 使用与以前相同的代码,只是主题类型有所不同。 输出: 第一:下一个(初始值) 第一:下一个(1) 第一:下一个(2) 第二个:next(2) 第一:下一个(3) 第二:下一个(3) 第一:下一个(4) secord:下一个(4) 第三名:下一个(4) secord:下一个(5) 第三名:下一个(5) 如您所见,输出的主要区别在于,发生订阅时,订阅者会立即打印该值。 记得? BehaviorSubject从初始值开始,然后将其或最新元素重放给新订阅者。 重播主题 输出: 第一:下一个(1) 第一:下一个(2) 第二个:next(1) 第二个:next(2) […]

Rx简介

使用可观察流进行异步编程的API。 Rx结合了Observer模式,迭代器模式和函数式编程的最佳创意。 您可以轻松创建事件流,使用类似于查询的运算符来组成和转换流,订阅任何可观察的流以执行副作用。 Rx无处不在,它适用于一切 :RxJava,RxJS,rx.NET,RxScala,RxCpp,RxRb,RxPY,RxGO等…(http://reactivex.io/languages.html) 我个人开始在ORFIUM(https://www.orfium.com)的最新iOS应用程序上使用它,我在问自己为什么以前不使用它。 我个人的观点是,至少每个移动开发人员都应该尝试一下(稍后您将感谢我 )。 Rx的基础 Microsoft的团队面临着解决异步,可伸缩,实时应用程序开发问题的挑战。 他们独立于公司的核心团队在图书馆工作,大约在2009年某个时候,他们提供了一个新的客户端和服务器端框架,称为.NET(Rx)Reactive Extensions。 它是.NET 3.5的可安装附件,后来成为.NET 4.0中的内置核心库。 自2012年以来,它一直是开源组件,并允许其他语言和平台重新实现相同的功能,这使Rx成为跨平台标准。 今天,我们有RxJS,RxKotlin,RxSwift,rx.NET,RxScala等。 所有这些库都努力实现相同的行为和相同的表达性API。 最终,使用RxSwift创建iOS应用的开发人员可以与其他使用Web上的RxJS的程序员自由讨论应用逻辑。 Rx代码的三个构建块是可观察对象,运算符和调度程序。 可观察的 观测值是Rx的核心。 您可能会看到可观察的,可观察的序列,序列或流,实际上它们都是同一回事。 一切都是一个序列。 可观察只是一个序列,具有某些特殊功能。 其中之一(实际上是最重要的)是异步的。 在一段时间内,可观察到的东西会产生事件,其过程称为发射。 事件可以包含值,例如数字或自定义类型的实例,或者它们可以被识别为手势,例如轻击。 一个observable发出包含元素的next事件。 它可以继续执行以下操作: …发出错误事件并终止,或者 …发出已完成的事件并终止。 可观察对象一旦终止,就无法再发出事件。 让我们创建一个可观察的 可观察对象在收到订阅之前不会执行任何操作。 如何订阅一个Observable? 订阅触发一个可观察的事件开始发出事件,直到发出.error或.completed事件并终止。 我们还可以通过取消对可观察对象的订阅来手动使其终止。 (处理) 订阅元素处理程序 订阅发生在数字上。 订阅 ,此时可观察对象正在发出事件。 输出 下一个(1) 下一个(2) 下一个(3) 已完成 订阅事件处理程序 输出 1个 2 3 已完成

象老板一样的可观察者— RxSwift简介

现在该开始您的反应式编程之旅了! 您的生活将不再相同。 这是将要发生的事情:我将尝试以可能最有趣,最简单,最令人难忘的方式来解释RxSwift(我已经研究了大约6个月)中的概念。 许多人告诉我他们已经开始学习Rx,但是却找不到继续的时间或精力。 我们开工吧。 你是一条狗。 您的主人可能会或可能不会有食物。 如果他们确实有食物,正在考虑食物,甚至看过食物,那么您想知道! 您想立即知道,以便做出最佳舞蹈动作并打扮迪斯科风格,以便可以吃饭。 这是你的生活,这是你的使命。 使用可观察对象非常像这样。 事情可能会或可能不会发生,当事情发生时,它们可能会有价值,也可能不会。 无论哪种方式,它们都为我们提供了一个可以处理几乎所有类型的类,我们可以对此做出反应。 通常在iOS中,我们将创建一个数据模型,将其放置在某个地方并设置我们的视图。 问题在于,我们希望有机会在数据发生变化时做出响应:某人只是喜欢一个帖子,您的爱犬朋友刚刚发现了一根骨头,或者您可以感觉到自己最大的克星并需要告诉世界:猫。 我们可以通过传统方式实现:我们可以拥有一个委托(可以响应特定事件并处理它们的东西),可以使用通知中心或使用回调。 通过Rx,我们将使用可观察的东西! 在本教程中,我们将以它们的基本形式查看它们,将它们弄乱一些,然后讨论如何使其变得更好。 我们的第一观察 让我们创建一个单视图应用程序,并使用Cocoapods或Carthage将RxSwift导入到我们的项目中。 导入RxSwift 想象一下,我们想制作一个翻译应用程序,该应用程序可以说狗叫(最先进,最精致的交流形式)并将其翻译为他们会理解的奇怪的人类声音。 通常,我们只需要创建一个String变量,但是使用Rx时,我们要处理的是Observable,它们实际上是随时间变化的值。 时间很重要,因为我们不知道什么地方或什么时间会改变: 让dogToSpeechTest = Observable .just(“ Woof”) 在这里,我们使用具有”语法的泛型,指定要处理的类型。 我们使用方便的’.just()’方法为可观察对象提供初始值。 我们可能还想向我们理解缓慢的所有者发送一系列消息: 让dogToSpeakArray = Observable 。from([[“ Get”,“ me”,“ food”]) 我们使用’.from()’运算符从数组创建事件序列。 关键是,我们实际上可以做什么? 好吧,我们可以订阅它们。 我们会讲出每个单词并在说出来时进行翻译,并更新用户界面! 观察值使我们可以访问以下内容: – onNext –下一个值已到达,已更改,这里是最新值–就像通知 – onError –出现问题了,您有机会对错误做出回应 – onCompleted-此任务已完成 – onDisposed –我们不再需要对此可观察的订阅,因为它不需要 […]