Tag: 响应式

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

这不是我的编程博客,但我无法抗拒发表此帖子。 我想为正在处理复杂(尤其是动态)表视图布局的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:观察运算符✅

如果您来自编程背景或具有某种专业知识,那么您一定会碰到Reactive一词,它在当今的编程世界中非常流行。 但是,如果您对它不那么熟悉,那就坐下来,通读全文,以掌握它。 让我们看看文本定义所说的关于响应式编程的内容, 在计算中,反应式编程是一种围绕数据流和变化传播的编程范例。 这意味着应该可以使用所使用的编程语言轻松表达静态或动态数据流,并且底层执行模型将自动通过数据流传播更改。 —维基百科 现在,这似乎是一些繁琐的编程工作,这些工作可能会给您留下查询的余地,但请不要担心,因为我会以一种绝对会让您满意RxSwift的方式向您介绍一些基础知识,所以让我们现在开始。 RxSwift是用于与Swift编程语言进行交互的框架。 该框架旨在通过为跨不同编程语言重复使用的某些任务提供通用词汇表来提供帮助。 从理论上讲,这使您更容易专注于语言本身的语法,而不是浪费时间弄清楚如何将常见任务映射到每种新语言。 您可能会问:“我为什么要使用它?”。 好吧,答案很简单 。 它只是简化了您的工作。 我们可以使用信号来代替通知,这些通知很难测试。 代替在代码中占据很多位置的委托,我们可以编写块并删除多个switch / if。 我们还有KVO,IBAction,输入过滤器,MVVM以及许多其他功能,这些功能可以通过RxSwift顺利处理。 请记住,这并非总是解决问题的最佳方法,但是您一定要知道何时充分利用它。 您可能会将Observable视为代码的智囊团,可以为您完成所有复杂的工作,其中可能包括网络调用,数据库获取,后台任务,庞大的循环函数等。 基本语法如下: 让helloObservable = Observable.just(“ Hello RxSwift”) 一旦完成了数据获取或任何复杂算法的计算,现在就需要显示结果或传递给其他函数进行处理。 您可以通过使用subscription(on:(Event )->())来实现。 如下 : 让helloObservable = Observable.just(“ Hello RxSwift”)let subscription = helloObservable.subscribe {事件在 打印(事件) } 可观察到的后期完成通过以下三个函数将结果发送给订户: 1.next (值:T)—当一个值或值的集合添加到可观察序列中时,它将向其订阅者发送下一个事件 ,如上所示。 关联的值将包含来自观察者的实际值。 2. error (错误:Error)—如果遇到错误,观察者将发出一个错误事件 。 这也将终止观察者。 3. Completed(完成) […]

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

根据 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 […]

Swift的反应式编程第1部分

如果您是iOS开发人员,那么您应该已经听说过RxSwift。 这是Reactive编程的快速版本。 RxSwift功能强大且有效,它将为您完成代码中的所有工作,并使您的开发人员生活变得轻松。 不相信吗? 比起您,我可以检查一下此介绍性的Reactive Programming,与我me —> 新手的Reactive编程 。 RxSwift漫游以下条款: –观察员与观察员 – 学科 –运营商 –调度程序 让我们开始一个个地探索所有这些东西。 可观察者和观察者: “事件A发出一些数据,订阅事件A的其他事件(例如事件B和事件C)将获得该发出的数据。 发出数据的事件(在这种情况下为Event-A)被称为“ 可观察的 ”或“ 可观察的序列 ”,并且接收到发出的数据的所有事件(在这种情况下为Event-B和Event-C)被称为“ 观察者 ”。 这是理解Observable的最简单定义。 可观察的数据可以是连续的,也可以在多个实例中发出。 观察者可以依次接收所有这些实例。 让我们检查下图: 这是上图快速显示编码的方式: let observableA = Observable.of(1,2,3,4,5,6)//创建可观察的 让observerB = myFirstObservable.asObservable() //订阅Observable readerB.subscribe {事件在 打印(事件) } 输出: 下一个(1) 下一个(2) 下一个(3) 下一个(4) 下一个(5) 下一个(6) 已完成 在这里,观察者B不断获取来自A的数据。相同的基础也将适用于其他观察者(C和D)。 您可能会对上面的输出中的“下一个”和“已完成”这两个术语感到好奇。 让我们检查一下。 可观察的生命周期: 可观测值包括三个主要事件: […]