Tag: reactivex

具有ReactiveKit的iOS中的MVVM

使用ReactiveKit实现MVVM登录示例 如果您已经开发iOS已有一段时间了,那么您可能已经听说过MVC : Massive View Controller 。 这种现象可以从对视图控制器中的Web服务器的无辜调用开始,然后突然出现:一个庞大的ViewController ,它有成百上千行,大量的职责和测试的噩梦。 苹果的MVC有很多替代方案,例如MVP , MVVM和VIPER 。 在本文中,我决定尝试使用ReactiveKit进行MVVM方法。 观看Bohdan Orlov撰写的有关iOS体系结构模式的精彩文章。 为什么选择ReactiveKit ? 关于RxSwift和ReactiveCocoa的样本很多,但实际上ReactiveKit的样本很少。 我真的很喜欢它的前身SwiftBond,所以我决定尝试它的演变。 在本文中,我们将基于ReactiveKit和MVVM创建一个简单的Login示例。 我们将使用三个依赖项: ReactiveKit , ReactiveUIKit和AlamofireReactive 。 您可以在ReactiveKit Github上了解有关它们的更多信息。 MVVM反应性登录 让我们开始创建一个简单的ViewController的示例,其中包含两个文本字段(用户名和密码)和一个登录按钮。 将IBOutlet链接到ViewController之后,我们将创建一个新的ViewModel类。 此ViewModel将保存ViewController将观察的属性 ,以更新其视觉状态。 属性将可变状态包装到可以观察该状态的对象中。 每当状态改变时,就可以通知观察者。 — ReactiveKit 但是,让我们从更简单的事情开始。 让我们创建一个initializer ,它接收两个属性 (一个用于用户,一个用于密码)并开始观察更改: ReactiveUIKit已经具有UI元素的多个属性,例如`rText`,这使将变量绑定到动作变得非常容易。 看! 现在,在用户键入每个字符后,我们会收到通知! 让我们继续并使用此属性做一些更有用的事情。 如果在字段中未输入任何文本,则将它们组合在一起以禁用登录按钮,并在用户键入有效的用户/密码组合后将其启用: 太棒了! 通过组合来自用户和密码的新值,我们可以决定是否要启用或禁用登录按钮,只需设置属性并将其绑定在按钮上,UI就会自动更新! 测试我们的ViewModel也变得轻而易举 。 我们可以模拟用户和密码的属性 ,然后测试ViewModel行为,而无需处理IBOutlets和UIViewControllers 。 注意:Quick用于BDD测试。 调用我们的后端以验证数据 […]

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)。 您可能会对上面的输出中的“下一个”和“已完成”这两个术语感到好奇。 让我们检查一下。 可观察的生命周期: 可观测值包括三个主要事件: […]

[RxSwift]观察员

안쓰냐고요?。? 네观察员입니다。 (단호) 观察者 。다。 可观察的도큐멘트로가보면렇게이써있다。 ReactiveX观察者可观察到的。 观察者observable이이이템(들)에다。 observer기서세가지,바로观察者,可观察的그리고subscription(구독)。 자,쓰이시작해시작해보시작해。 위의订阅함수는ObservableType의扩展名런식으이런식으로정의다。 옵저버는만들어지는걸까..옵저버는observable을订阅있었다있었다。 2.观察者대한订阅 이코드가의미하는것은。 우선asObservable은ObservableType의扩展의정의되어다。 Ob로ObservableType을Observable변환해준다는다。 붙는.subscribe(observer)는? serv것도serv serv있는协议serv serv serv serv serv다。 。기본적으로형태를보면이러하다。 안에订阅의해정다형태이다。 해당订阅。다같다。 이위해스에서의이받위해기위해观察者구독한다。 문법 * 0位用户已选择“ Next”(另一位)观察者。 *错误나已完成이시퀀가시퀀스는스아무런지않는다않는다。 이동시에이각기다른스있있지만 리소스관리 *完全错误完全错误完全错误。 *订阅에서에서를다호출한의해해해해하하를를。 값 订阅,“观察者”订阅。 자다다다다다보됐는데。 그러니까观察者대한대한订阅을다거다。 형태리고(一次性)써있다。 다시보자。 그러니까 self.asObservable()。subscribe(观察者) 观察者观察者观察者一次性观察者。 。스트에서이있。이있다。 실제코드를보면 观察者,观察者,观察者,观察者!!!! 观察者观察者观察者观察者订阅观察者订阅。

链接依赖观察

我需要创build依赖的API调用,其中第二个需要第一个返回的值。 首先想到的是使用flatMap ApiManager.shared .createReport(report: report) .flatMap { (report) -> Observable<Report> in return ApiManager.shared.createReportStep(reportID: report.ID) } createReport返回Observable<Report> ,在成功调用返回更新后的Report模型(带ID)之后,我需要调用API来创build报告步骤,其中需要report.ID 。 一切看起来和工作正常的代码,但是当我需要在每个步骤( createReport和createReportStep )后都需要做些事情时,问题就出现了。 我把代码放在onNext块中,但是在两个步骤完成之后它只被调用一次。 两步之后有没有办法接收onNext信号? 我可以使用这样的东西: ApiManager.shared .createReport(report: report) .concat(ApiManager.shared.createReportStep(reportID: report.ID)) 哪些会emmit像我想要的两个信号,但是,然后再次从哪里得到更新report.ID来传递给createReportStep ?