Tag: Rxswift

RxSwift ve RxCocoa’yaGiriş

Bugünsizlere 4个版本iOS开发人员hayatımdakullanmaktan ençokkeyifaldığımve beni daha iyi bir开发人员halinegetirdiğineinandığımbiraraçtanbahsetmek istiyorum。 Buyazıyıokuyarakgünümüzdeçokpopülerolan反应性程序,RxSwift和RxCocoa说,迅速发展,大力发展edebilecek seviyeyegeleceğinizeinanıyorum。 首席iOS开发人员olarakçalıştığımBundle News’da dayoğunbirşekildebuyapılarıkullandığımızıve gayet memnunolduğumuzubelirtmek isterim。 RxSwiftkütüphanesi使Swift’i tamamenfarklıbirşekildekullanmamızaolanaksağlıyor。 Bukütüphaneyleasenkron programlama yapmak hemçokkolay hem deçokdahaokunaklıhale geliyor。 dahasağlammimarilertasarlamanızave daha kaliteli uygulamalaryapmanızaolanaksağlıyor。 RxCocoa可以在iOS或OS X上运行,而可乐API可以在反应性中使用。 Buyazıdabilmeniz gereken konseptlerden biri可观察的vediğeriObserver’dır。 可观察到的 (gözlemlenebilir),değişiklikleriyayımlayanyapılardır。 观察员 (gözlemleyici)yapılar可观察到的yapılara订阅olarak,değişlikolduğundahaberleri olanyapılardır。 RxSwift和RxCocoa,ARC已售出DisposeBag denilen biraraçbulundurmaktadır。 DisposeBag’i观察员objeleritaşıyansanal birçantagibidüşünebiliriz。 Observer’larıtanımladığımızebeveyn objelerin(父对象)hafızadanuçtuğundaObserver’larındandadüzgünbirşekildekurtulmakiçinDisposeBagaracınıkullanırız。 Biraz kavramlar konusundakafanızkarışmışolabilir amayazınındevamındadaha iyianlayacaksınız。 大小RxSwift ve RxCocoakütüphanelerinidaha […]

如何将RxSwift与MVVM模式一起使用-第1部分

本文全部涉及如何将RxSwift与MVVM结合使用。 几年来,RxSwift一直是swift社区中的热门话题,但是我设法避免了它。 我花了一段时间将自己的大脑切换到一切都是可观察的状态。 一开始我也遇到了麻烦,要弄清楚何时使用Variable , Observable , PublishSubject以及如何将值绑定到UI组件。 我将在此博客中介绍所有这些主题。 我将展示如何在MVVM中使用RxSwift,在RxSwift中使用UITableView ,如何编写网络层以及如何测试RxSwift应用程序。 我不会从头开始讲解MVVM模式,但是在阅读该系列文章之后,您将可以在MVVM中使用RxSwift。 如果您想学习MVVM模式的基础知识,建议您阅读我先前发布的带有Swift应用程序的MVVM。 我将通过展示如何编写一个名为Friends的应用程序来介绍这些主题。 您可以从GitHub获取该应用程序的完整源代码,只需签出RxSwift分支即可。 18个月前,我使用不带RxSwift的MVVM编写了该应用程序。 现在,我认为将其重构并查看将RxSwift与MVVM一起使用时的外观会很好。 朋友是一个iPhone应用程序,它下载朋友列表并将其显示在该应用程序中。 您还可以添加,删除和更新朋友。 因此,这是一个简单的应用程序,具有足够的复杂性,可以满足iOS应用程序的许多基本需求。 这也是开始学习如何将RxSwift与MVVM结合使用的好地方! 顺便说一句,后端是使用Vapor快速编写的! 在应用程序的第一部分,我将展示将RxSwift与MVVM结合使用的基础知识。 设置正确的CocoaPods。 在ViewModel和视图之间绑定数据。 使用UITableView ,显示一个加载指示器以及如何向用户显示错误。 我们将首先浏览实现的ViewModel端,然后是视图。 首先,我们需要将RxSwift添加到项目中。 在此示例中,我们将使用CocoaPods,但您也可以使用Carthage和Swift Package Manager。 查看GitHub仓库以获取更多信息。 在pod文件中,您需要添加: RxSwift添加了基本库,包括Observable , Variable , PublishSubject等。RxDataSources包括与UITableView和UICollectionView相关的反应式库。 RxSwiftExt帮助将可观察对象直接绑定到UI组件。 我们还将为我们拥有的测试目标添加所有库。 在完成Podfile的编辑之后,我们需要在终端中运行pod install 。 在如何将RxSwift与MVVM结合使用的第一部分中,我们将专注于应用程序的第一个视图: 第一个视图具有一个表视图,该表视图显示了从后端加载的所有项目。 为了展示所有这些,我们将FriendTableViewViewModel & FriendTableViewController 。 让我们从ViewModel开始。 ViewModel是使数据为视图准备就绪的模块(在本例中为FriendTableViewController)。 ViewModel还是我们放置大多数业务逻辑的地方。 我说“最”是因为我们应该避免在ViewModel变成另一个转储所有代码的地方的情况。 您可能听说过MassiveViewController问题,但我们也不想以MassiveViewModel结尾。 […]

RxSwift变得简单:第1部分—入门

欢迎阅读我关于RxSwift的系列文章中的第一篇。 如果您有兴趣学习反应式方法并将其应用于iOS项目,那么您会很幸运! 本系列将通过越来越复杂的功能进行介绍,并说明它们在代码中的实际应用。 让我们开始吧! 响应式编程已经存在了将近20年,但实际上仅在最近十年才引起关注。 为了使响应式编程能够在多个平台上使用,已经对最流行的编程语言进行了扩展。 前缀Rx(在RxSwift中可以看到)表示“反应性扩展”。 关于扩展的重要知识是,所有语言的底层方法都完全相同。 出于很多原因,这很酷,但立即想到的三个是: 您可以使用本机平台和语言来采用反应式编程方法。 您可以轻松地跨语言和平台进行协作。 一旦学习了一种语言的反应式编程,就可以将该知识直接转移到具有反应式扩展的任何其他语言。 听起来很有前途。 那是什么 响应式编程是一种处理异步数据序列的方法。 也就是说,向观察者发出事件的元素的可观察序列。 开始进行反应式编程可能有点吓人,因此在下一节中,我们将布局用于创建和观察序列的阶段,然后解释每个阶段的重要术语和概念。 让我们设置一个基本的可观察序列,然后对每个步骤进行解释:

转换运算符:地图,flatMap和flatMapLatest

RxSwift提供了一系列运算符,它们可以极大地控制您要如何处理应用程序中的数据和事件。 当您要对来自序列的数据进行建模以适合您的需求时,可以使用转换运算符。 换句话说,准备数据以符合订户的要求。 例如,要转换从Observable序列发出的元素,可以使用map运算符; 当元素从源Observable序列发出时,map将对其进行变换。 这类似于标准Swift库中的map(_ 🙂方法,不同之处在于此地图可用于Observable序列元素。 地图运算符的大理石图表示将如下所示: 实际地图(_ 🙂 我们将举一个在操场上使用地图的例子。 我们将需要我们的辅助函数,即executeProcedure(with description:String,procedure:()-> Void) 。 此函数有两个参数:字符串描述和过程闭包。 然后打印说明,然后执行该过程。 公共函数executeProcedure(用于描述:字符串,过程:()->无效){ print(“执行程序:”,描述) 程序() } 现在,我们将使用of运算符创建一个Observable整数序列: executeProcedure(for:“ map”){ Observable.of(10,20,30) } 然后,我们将使用map运算符将每个整数元素自身相乘: Observable.of(10,20,30) .map {$ 0 * $ 0} 然后,我们将订阅onNext来打印每个转换后的元素: Observable.of(10,20,30) .map {$ 0 * $ 0} .subscribe(onNext:{ 打印($ 0) }) 之后,我们对subscribe(onNext 🙂的返回值调用dispose() 。 请记住,订阅将返回Disposable 。 该函数的总体代码如下: executeProcedure(for:“ map”){ Observable.of(10,20,30) […]

RxSwift视图模型的剖析

视图控制器中使用每个属性来驱动UI行为。 在此示例中,每个输入和输出都是一个Driver ,因此强烈建议使用Driver ,因为Driver始终在主线程上运行,永远不会完成,并且永远不会产生错误事件。 这使得视图控制器对那些Driver具有非常简单的响应。 将视图模型连接到视图控制器 看一下将这些Driver绑定到UI控件有多么简单: DisposeBag ,在新版本的RxSwift中,可以使用更好的样式将Disposable插入DisposeBag中。 现在,您可以使用相同的代码块执行以下操作: 视图模型初始化器 关于该视图模型的下一件要注意的事情是,使用格式正确的元组将输入和依赖项传递到初始化程序的简洁方法。 这种样式无疑使视图模型的输入是什么,并且还提供了对任何依赖项的清晰声明。 Zaher在评论中指出,在init方法的主体中, 一切都只是一个定义。 从输入序列到输出序列的纯转换。 该引言总结了MVVM视图模型最重要的一个方面: 将 输入序列转换为输出序列。 需要注意的另一件事:类上没有其他方法。 一切都在init函数中发生。 相反, SearchResultViewModel是确实具有实例方法的视图模型的示例。 让我们看一下这如何影响init的设计。 因为init方法在初始化所有属性之前无法访问self,并且因为他想在self上使用这些方法来准备imageURL和title输出,所以他被迫为它们提供一个临时值,然后用实际输出覆盖它们。 我不推荐这种方法。 在视图模型上避免实例方法 视图模型上的实例方法只会增加内存泄漏的风险。 这些方法的任何调用都需要引用self。 您必须非常小心, 不要 在闭包内部使用实例方法 。 Zaher不在任何闭包内使用它们,因此SearchResultViewModel没有泄漏。 但是我会争辩说,即使为此使用实例方法也为意外的内存泄漏打开了大门。 如在此重构版本中一样,最好使用文件专用顶级功能。 最终结果是GithubSignupViewModel2.init充当静态函数。 将其输出连接到控件后,不再需要返回的GithubSignupViewModel2实例。 输出将保留在内存中直到被处置,但视图模型实例本身已被释放。 这样可以确保没有内存泄漏。 视图模型可以是不变的结构 GithubSignupViewModel2可以很容易地成为一个struct 。 实际上,将其更改为一个struct ,它仍然可以编译并运行。 由于您只需要一个实例,并且由于其所有属性都是不可变的,因此对于此视图模型而言,实际上更喜欢使用struct 。 视图模型可以是一个功能 因为我们可以并且应该设计视图模型以在init方法内部完成所有输入到输出的转换,所以我们实际上只需要一个函数。 在下面的要点中,我将视图模型重构为顶级功能。 没课。 没有结构。 只是一个功能。 这是您可以粘贴在RxExample项目中的要点,以替换原始的GitHubSignupViewController2 ,然后编译并运行。 […]

使用RxSwift编码更快

人们通常谈论反应式编程,特别是RxSwift作为描述应用程序逻辑的最终方法-事件链,错误处理,异步。 但是不要忘了RxSwift还是一个工具,它允许您向任何内容添加反应式扩展。 RxSwift有一个相当大的创意社区。 RxSwiftCommunity的github配置文件当前具有55个不同大小和用途的存储库。 所有这些的根本是反应式编程。 下面我将讨论已经成为我的Podfile必需的依赖项。 Rx键盘 我们都喜欢用键盘覆盖一个密码字段,不是吗? 我不会数行代码,也不会描述我对使用NotificationCenter厌恶。 只要看看通过事件序列的概念来表达键盘高度的变化是多么酷。 让我提醒您,这里有所有Rx运算符。 您可以使用debounce ,或在此处与另一个Observable结合使用,依此类推。 这是我最喜欢的声明性代码的示例: RxKeyboard.instance.isHidden .drive(backgroundFadeView.rx.isHidden) .disposed(作者:disposeBag) 我可以解释一下,当键盘被隐藏时,我将隐藏backgroundFadeView ;如果键盘可见,则将其显示。 但是您乍一看就知道了。 手势 当UIButton不够用时,这是一种非常普遍的情况。 让我们比较一下语法: 同样,我可以解释一下,我们仅过滤.ended手势并计算翻译。 但是很明显,即使您不熟悉此框架或RxSwift。

RxSwift中重试运算符的指数补偿

本文将专门介绍我们称为RxSwiftAutoRetry的新开源库。 它是RxSwift的一个小扩展,可以重试以指数延迟的流。 它不是很复杂,我相信该操作员可以节省时间,并有助于发送网络请求。 在进一步详细介绍该库的确切功能以及如何正确使用它之前,我想向您简要说明为什么我们决定创建它。 前一段时间,当我创建一个用于测试的小项目时,我想尽可能多地利用RxSwift。 该项目将服务用于请求,这些服务也由RxSwift维护。 一切都按预期进行。 但是我在负责请求的部分上工作的时间越长,我就越想知道它在每种情况下是否都能正常工作。 然后我意识到,这会在接收瞬​​态故障时引起潜在的问题。 短期内,短暂故障是由于服务不可用(网络错误或服务器过载)而无法与外部服务进行通信时发生的一种故障。 但是,几秒钟后再次调用服务可能会成功。 为了防止瞬态故障,我们可以使用指数退避算法,该算法在每次重试时都会以指数方式增加延迟时间。 为什么采用指数算法? 想象一下当您由于服务过载而收到瞬态故障时的情况。 当新请求接近该服务时,它们将自动被拒绝。 如果我们不断尝试以固定的时间重试,则可能会成功。 但是,我们也会增加服务的负担。 在这种情况下,服务将保持不可用状态的时间更长,恢复时间也将更长。 但是,如果不是在固定的时间延迟后重试,而是在每次重试时增加它,该怎么办? 例如,第一次失败后,我们将等待1秒,第二次失败后,将等待2秒,第三次失败后,将等待4秒,依此类推。 这可以使我们的服务有足够的休息时间来解决过载问题。 重试运算符已经在RxSwift中实现,但是我认为它与网络请求不兼容,因为: 收到错误事件后立即重新发出所有事件(无延迟) 如果用户提供参数,则重新发射将处于无限循环中,或者将持续指定的重试次数 如果某些实例同时发出,则可能发生数据包冲突。 为了避免数据包冲突,我们的重试操作符版本使用了抖动。 它是一个乘以指数值的随机值。 因此,即使两个用户同时发送网络请求,也不会有任何数据包冲突。 我们提供了三种非常简单的方法将库导入项目。 您可以通过CocoaPods,Carthage和Swift Package Manager来完成。 所有说明均在本文开头提到的GitHub站点上提供。 那么您如何使用它呢? 这很简单。 最简单的方法: Observable.retryExponentially() 实际上,这就是您需要做的所有事情。 当然,如果您想为此方法提供值,则可以编写如下代码: 不用担心,我将解释这些参数负责什么: maxAttemptCount —重复序列的最大次数。 (默认值: 3 ) 抖动 —乘法器,它使延迟时间随机化。 从给定范围内选择随机值。 (默认值: 0.9…1.1 ) 调度程序 —将在其上执行延迟的调度程序。 (默认值: ConcurrentDispatchQueueScheduler(队列:DispatchQueue.global()) […]

RxSwit —使用“发布主题”传递数据

有很多人描述了响应式编程的不同定义。 但是根据我的研究和分析,我为此找到了捷径。 “ RxSwift是异步编程的新范例。, 我在RxSwift上工作了一年,所以对它的好处有所了解。 我能够隐约地回答这些问题。 我虽然不简洁。 第一件事是在ViewController.swift文件中使用默认文本和DisposeBag变量创建UILabel的Outlet。 DisposeBag是RxSwift的内存管理机制。 现在,我们编写用于订阅的代码,该代码观察EditViewController文本和颜色的PublishSubject的值。 PublishSubject是主题的一种。 我们可以说PublishSubject既是Observer也是输入。 但是根据不同的主题属性,PublishSubject会忽略订阅之前发出的所有元素。 我们在ViewController中有一个名为Let’s Edit的Button,可将其重定向到EditViewController以选择文本和颜色。 下面是按钮的代码。 订阅观察者: 在上面的代码中,当单击红色,绿色或蓝色按钮时,我们观察到EditViewController发出的文本和颜色主题。 这可以使用subscription(onNext,onError,onCompleted)方法完成。 订阅方法将通过处置(by 🙂方法处置 。 onNext()将在下面的代码中发出该值,该值将由ViewController简单地订阅。 声明发布主题: 在这里,我们创建一个文本字段出口。 同时声明文本和颜色观察者。 文本观察器是String类型,它传递文本字段的值,颜色观察器传递颜色对象,方法是单击颜色按钮(红色,蓝色和绿色)。 通过观察者发射元素: 当用户在文本字段上输入一些文本并触摸下面的颜色按钮之一时,即会发生 textObserver发出文本值。 根据颜色按钮标签,它将使用colorObserver传递颜色值 最后,它将弹出到ViewController,因此可以显示更改。 演示程序的输出如下。 您可以检查它的简单程度,也可以尝试使用代码。 享受代码…

专家不想让您知道反应式编程的五个不可思议的秘密!

根据 2017年2月24日在墨尔本 Playgrounds 的演讲 。 我被要求拿出一个超级点击链接标题作为标题,这里是: 专家不想让您知道的反应式编程的五个不可思议的秘密! (我仍然不清楚为什么专家不希望您知道这些事情。) 我听说它说过关于学习Lisp或Prolog或函数式编程的知识-即使您可能再也不会使用Lisp了,学习语言和它的工作方式(可能)会(改变)您思考代码的方式和设计程序的方式。 同样的事情适用于反应式编程吗? 它为我做了; 用RxSwift编写应用程序突出了一些我已经知道的最佳实践和体系结构选择,但是在以响应式方式进行思考时,它们处于最前沿。 这些实际上并不是本质上的“秘密”,而是更像是“大图构想”,随着我对反应式编程的更多了解,这些构想在我脑海中得以巩固。 继续阅读以了解它们是什么! 1.你已经知道了 好消息是您已经知道构成反应式编程的部分。 如果您以“传统”可可风格编写iOS应用程序,并且了解函数编程,那么您已经知道什么是函数。 它更多地是关于学习一种新的风格,一种新的思维方式以及也许一些新单词,例如每个人都喜欢的“ monad”。 反应式编程也是如此:您将看到以熟悉但新颖的方式使用的旧概念,例如序列,闭包和map 。 它们的组合方式以及用于描述它们的语言可能是新的,但构成要素是相同的。 2.一切都是一个序列 在设计反应式应用程序时,我首先想到的是:序列是什么? 我喜欢将它们分为两大类,即输入和输出。 由于RxCocoa提供了对通用类的扩展,因此您可以直接获得许多这些序列或可观察对象 。 例如, UISlider具有可观察到的,提供一系列Float值的对象。 UIButton具有一个可观察到的对象,它在每次点击按钮时都会触发。 您也可以使自己的观测值。 我为Mac应用程序编写了一个,以跟踪鼠标单击。 只要在视图上单击鼠标, NSViewController收到mouseDown(with:event)方法调用。 您可以让RxCocoa侦听该方法调用,并将其转换为可观察到的: self.rx.sentMessage(#selector(NSResponder.mouseDown(with:))) .map({ (params) -> NSPoint? in if let event = params.first as? NSEvent { return self.view.convert(event.locationInWindow, from: nil) } return […]

通过实现Observable学习Rx

从我的角度来看,如果您是软件开发人员,则有几种学习新技术的方法: 阅读有关它 玩吧 破解或实施类似的东西 网上有很多例子说明了前两个例子,但很少有例子说明如何实现Rx。 因此,让我们看一下Rx核心原语的接口: 可观察的: 根据Observable的文档界面非常简单: 好吧,这很酷! 但是Rx的强大功能也在运算符中……因此,让我们实现map运算符: 与Rx中数组映射的映射相同,通过应用transform函数来transform序列的每个元素并返回新序列 回顾一下: Observable —是一种类型,您可以在其中通过调用subscription()传递一个Observer (基本上是一个回调)。 如您所见,所有魔术都发生在订阅方法中。 这就是使Rx如此强大的原因,您可以转换序列并传递Observable实例,而不必担心会发生什么事情 结论: 确保这是天真的,还没有准备好进行生产。 但是我真的希望它表明Rx背后没有魔力! 这里有游乐场 从这往哪儿走: RxSwift回购 ReactiveX网站 雷·温德利奇团队的RxSwift书 Rx背后的数学