Tag: Rxswift

RxSwift —主题

在RxSwift中潜水时,您需要概述主题。 那么什么是主题? 主体既充当可观察者又充当观察者。 他们可以接收事件,也可以订阅。 主题接收到.next事件,并且每次接收到事件时,它都会转身并将其发送给其订户。 RxSwift中有4种主题类型: • PublishSubject :开始为空,仅向订阅者发出新元素。 • BehaviorSubject :从初始值开始,然后将其或最新元素重放给新订户。 • ReplaySubject :使用缓冲区大小初始化,并将维护一个达到该大小的元素缓冲区并重播给新订户。 • 变量 :包装BehaviorSubject,将其当前值保留为状态,并仅将最新/初始值重放给新订户。 本部分重点介绍PublishSubject 一张图片胜过千言万语 第一个订阅者在1之后订阅,因此没有收到该事件,它接收2和3。第二个订阅者在2之后订阅,因此它仅接收3。 练习一万字 (😀) 假设我们有一个String类型的PublishSubject 让主题= PublishSubject () 尝试发出事件: subject.onNext(“没有事件发出吗?”) 什么都没打印出来? 是的,因为没有关于此主题的订阅。 让我们创建一个订阅: let subscriptionOne = subject .subscribe(onNext:{ 打印 字符串 (“ First Subscription:”,字符串) }) 现在使用主题发射物品 subject.onNext(“ 1”) subject.onNext(“ 2”) 肯定地,输出打印出1和2。 现在,让我们创建另一个订阅: let subscriptionTwo = subject .subscribe({ […]

RxSwift + MVVM:如何提供ViewModels

介绍 自从我们开始在BlaBlaCar的Model-View-ViewModel(MVVM)架构中使用RxSwift以来,已经快一年了。 我们对结果感到兴奋。 我们用这种方法编写的代码更容易理解,维护,测试和扩展。 但是,最初的几周并不是小菜一碟:我们必须在MVVM + RxSwift架构的某些方面进行迭代,以使事情变得正确。 其中之一是将输入提供给ViewModel的方式。 让我们通过两种不同的方法向ViewModels提供输入(Rx事件)。 但是首先,让我们快速讨论一下ViewModels。 视图模型 ViewModel的公共合同非常重要。 您必须做到正确(出于多个原因): 它应该可插在任何View上,即,不是通过View的构建方式来定义ViewModel的公共合同。 提醒一下,拥有ViewModel的是View。 换句话说,View知道ViewModel,而不是相反。 它应该是可测试的。 最后,MVVM体系结构的最大好处之一就是使业务逻辑可测试。 MVVM具有绑定机制,因此让我们在RxSwift中加以利用。 设计ViewModel合同时的经验法则是,始终尝试将ViewModel视为一个简单的黑匣子,该黑匣子接受输入以产生输出。 说到Rx,这意味着ViewModel消耗了一些Streams的事件(输入)(大部分时间由View提供)来计算输出Streams(用于View)。 从那里,可以编写一个简单的协议来表示任何ViewModel应该具有输入和输出。 接下来,该协议有2种不同的实现,每种都有各自的优缺点。

RxSwift中flatMap函数的改进

如何对RxSwift和许多闭包感到满意 嘿! 如果您阅读了此书 ,则可能会精通RxSwift和ARC ,了解弱关键字和无主关键字之间的区别。 如果否,请熟悉它,然后回来! 在我的第一篇文章中,我想向您介绍我的flatMap改进。 我立即开始遇到问题… 例如,我们有两个请求: Login和LoadPosts 。 登录后,我想获取当前用户的帖子: 弱 ,我选择你! 现在您可能想要将以前的代码更改为此代码: 但是,当您有很多flatMap函数时,它看起来是如此混乱—我们不想看到混乱的代码! 只有优雅,优美的代码! 是时候进行出色的扩展了: 现在我们的要求看起来像这样: 所有flatMap函数都有完整的代码段:

RxSwift#3 —运算符

运算符运算符。 操作员可观察到벤트들을이준처리할준다준다。 가볍게运营商가무엇인지살펴보면서보시작해 操作员Rx는기본이다。 运算符사용해Observable벤트를벤트를벤트를리하여있다。 运营商는로그룹으다 过滤算子 转换运算符 合并运算符 过滤运算符.next随即添加。 。过滤 벤트만이벤트만다 .distinctUntilChanged 값이이어질막아준다 可观察的변형하는运算符 。地图() 이벤트를다른이벤트로변형 可观察的Swift map 같다。 .scan() 있고가지있고있고있고벤트를있있다。。 벤트이벤트의원본이벤트다 초기값을지정해야다 룬다룬运算符들을제를를보살펴 筛选器용해文字n아닐져온져온져온져온 节流阀사용해0.5장장장이최신사용한다 文字를SearchRequest로변환한다 이데식으흐름터를터를터를있습니있습니다있습니。 [4장:RxSwift용한이용한MVVM패턴] RxSwift#4 — RxSwift용한이VM MVVM패턴 在MVVM和RxSwift中进行比较。 medium.com

带有RxSwift的MVVM:用于假人的KickStarter

本教程的目的是开始学习RxSwift 。 通过一个简单的示例,您将能够在其中进行更多探索…… 就像上一个故事一样,我已经解决了MVVM… iOS / Swift MVVM:傻瓜Kickstarter 这个故事是关于我们如何开始学习MVVM体系结构的。 由于您会在…中看到许多教程, medium.com 使用RxSwift继续执行相同的添加购物车功能。 就像电子商务应用程序(如Amazon,Flipkart等)中的购物车一样,用于添加,删除或更新产品数量。 在继续之前, 请从这里简要介绍RxSwift … 在10分钟内学习和掌握⚔️RxSwift的基础知识 每个程序员都应该听说过Rx。 无论是在上次开发者大会上还是在阅读新文章时发生的… medium.com 为此,您至少了解RxSwift中的“ 主题” 。 来吧 !!! 😄 在CartProductTableViewCell中 ,添加以下协议以便可以删除“ +”和“-”按钮。 协议CartProductCellDelegate:class {func updateQuantity(_ cell:CartProductTableViewCell, isIncreasing:Bool)func remove(_ cell:CartProductTableViewCell) } “ +”和“-”按钮将调用updateQuantity委托,而“删除”按钮将调用“ 删除一个”。 购物车经理 让我们从添加一个名为CartManager的新文件开始。 它将是一个单例类,如下所示。 类CartManager { 静态让共享= CartManager() 私人init(){} } CartManager类将处理或购物车项目,引入称为CartProduct的购物车模型。 struct CartProduct { var啤酒:啤酒 var数量:整数 […]

构建一个iOS前端以使用RxSwift验证数字代码

在某些情况下,通常与无密码身份验证或第二因素身份验证有关,在这种情况下,iOS用户需要输入通过电子邮件或手机短信收到的一些4位或6位数字代码。 这是我们要构建的需求: 有6位数字的数字代码,因此有6个大的’boxes’ 。 每个框只能包含1个数字。 用户在框中输入数字后,光标会自动跳至下一个。 用户可以将光标放在任何框上进行更正。 一旦他们点击一个框,框就会变空。 然后,用户可以输入一个新数字。 在任何给定时间,如果所有框均已完全填写,则“ Verify按钮将变为启用状态。 如果任何框为空,则“ Verify按钮将被禁用。 我称它为’box’但它只是View顶部的TextField ,其高度为1个单位。 然后,将它们都放置在垂直的StackView (这意味着轴是垂直的)。 然后我重复了6次,最后得到其中6个StackView实例。 现在就像玩乐高游戏一样,我将这些StackView所有6个实例放置在另一个StackView 。 外部StackView是水平的。 这是ViewController在情节提要中的屏幕截图: inner StackViews一些关键属性是: 轴:垂直 对齐方式:填充 分布:等距 间距:1 和outer StackView : 轴:水平 对齐方式:底部 分布:均等填充 间距:7 数字TextField一些关键属性: 字体:System 48.0 边框样式:无 键盘类型:数字键盘 情节提要中的其余作品都涉及放置正确的约束。 在离开情节提要之前,创建一个标签为Verify的Button 。 将其enabled属性设置为false,并将alpha为0.25。 我们希望默认情况下“ Verify按钮显示为禁用状态。 第一个要求是作为TextField每个框只能包含一个数字。 以下关于StackOverflow的答案就是正确的解决方案。 因此,我们创建一个名为LimitLengthTextField.swift的文件,其内容如下: 回到Storyboard,并确保我们将TextField的Max Length设置为1,就像上面的StackOverflow答案所描述的那样。 接下来,我们准备将RxSwift和RxCocoa添加到Podfile : 然后将它们导入到ViewController类(记住将这些IBOutlet连接到Storyboard): 现在我们将开始添加一些non-RxSwift代码: […]

Swift中的多功能名称空间

在Swift中,某些API(例如RxSwift)使用的技术将它们公开的代码限制在专用名称空间中。 在这篇文章中,我们将说明如何以最通用,最通用的方式完成此操作。 随时访问我的博客以阅读原始文章(语法突出显示更好) let myButton = UIButton() myButton.rx.tap.subscribe(…) // this is a RxCocoa kind of code 您是否想过在Swift中编写这样的代码行是怎么可能的? 这是.rx。 乍一看似乎很尴尬的部分,不是吗? 它的行为就像某种自定义名称空间。 这是变量吗? 这是内部阶级吗? 我们有一些线索可以弄清楚: 由于可以通过点符号访问。 它必须是UIButton类的成员 它作为tap等一些属性,因此它是一个数据结构 通过这两个线索,我们可以尝试创建自己的名称空间。 在以下示例中,我们将尝试向UIButton添加自定义名称空间,以显示单个函数hello 。 由于名称空间必须是数据结构,因此我们尝试使用Swift结构: struct ButtonNameSpace { func hello () { print (“Hello”) } } 到目前为止,一切都很好。 由于名称空间应该是UIButton的成员,因此我们将其添加为计算属性: extension UIButton { var nameSpace: ButtonNameSpace { return ButtonNameSpace() } } 现在,我们可以像这样使用它: […]

RxSwift#4 — RxSwift용한이VM MVVM패턴

在MVVM和RxSwift中进行比较。 있는있는가가있는VC MVC면서 면서보면서시작해보자 MVC:模型+视图+控制器 MVC쓰이。이다이다。 控制器控制器 模型 视图视图 控制器 。 查看 데이터들을보여주는하고 Model Model 데터를터를터를터를다。 MVC있있있지만, 앱이커져서스클래스클래가지게다면면? 개의개의개의상의상의시작된시작된시작된다。。시작된 애플의MVC패턴은 视图 와 控制器 있어 Controller ViewController 한한다。 在MVC中,选择“ Massive View Controller”。 控制器控制器控制器控制器 。 类别中的다를过载M이것이지이아니가MVC아니다。 많은많은App들이MVC패턴으로개발되었기개발되었이다。 MVVM:模型+视图+视图模型 ViewModel은View를표현하기만들어진模型 ViewModel建模模型View的视图。 MVVM下载。 型号 대한다대한스들이데이터대한通知을보내더라도이통신하통신하지않는다。 ViewModel和 Model一起查看ViewController(View)的方法。 ViewController 는View Life Cycle을처리하고이터를UI구성요소에bind할때만View Model및View와다통신한。 (MVC패턴에서처럼)View는를ViewController인식한다。 问:그렇다면ViewModel은MVC에서의ViewController是否提供? A:그렇기 도 , 도지않기도다 在ViewController中使用ViewController。 […]

MVVM,我们如何使用它,它如何帮助我们

MVVM的名称太酷了,您可能会认为它是一个超级架构模型,可以简化从编码到调试的所有工作。 但是,它实际上可以完成所有这些工作吗? 根据我们在REKAB的经验,答案是肯定的。 单独使用MVVM并不能为您做到这一点,但是如果将其与其他方法(例如与Rx绑定和使用Coordinator)结合使用,则可以声称MVVM可以使一切轻松。 轻松编码并不意味着减少代码量。 这意味着更干净的代码可以读写。 使用MVVM + Rx绑定+协调器会导致更多的代码行。 这就是REKAB在我们开始使用此技术时所发生的情况,并且我们的代码增大了20%到30%,但是只要能使调试变得更容易并且添加新功能更加简单,几行代码就不会打扰任何人。 关于MVVM + Coordinator并使用Rx概念的教程太多了,我不想在这里重复。 我想讨论的是我们如何使用这些技术,以及它如何帮助我们使REKAB开发更好,更快且错误更少。 绑定,绑定,绑定 MVVM基于绑定,有两种绑定方法,一种很酷的方式,另一种方式。 很酷的方法是使用Rx进行绑定,这种绑定更加健壮,您可以绑定几乎所有内容。 另一种方法是使用Swift didSet 。 您可以在调用didSet值时调用函数或执行某些操作。 要记住的重要事情是如何组织Pod文件。 考虑我们的应用程序的以下示例: 我们将Profile模块嵌入到MainScreen模块中,并将MainScreen模块嵌入REKAB模块中,因此,如果您在Profile模块中使用Pod,则必须将其同时包含在MainScreen和REKAB模块中: rekab-app / MVVMC示例 通过在GitHub上创建一个帐户为rekab-app / MVVMCExample开发做出贡献。 github.com

iOS:Tiendeo应用程序中的MVP清洁架构

Tiendeo移动部门在2017年面临着巨大挑战:从头开始重新制作该应用程序。 我们的旧版应用程序创建于2013年。它是使用简单的MVC架构,Objective-C(当然)构建的,它使用RestKit,AFNetworking和许多其他Pod …经过多年的开发和一些开发人员,它变得庞大,不可扩展,不稳定,具有大量的视图控制器,大量的AppDelegate,一些新功能都在Swift中进行了编码,还包含一些重构的部分,因此我们很少有Swift-Objective-C桥,……这是一个为孩子们吃早餐的怪物。 考虑到所有这些问题以及业务方向的一些变化,该公司与移动部门一起决定重新制作该应用程序。 ✨ 因此,尽管我们为旧版应用程序提供了少量维护,但我们开始同时为Android和iOS两个平台构建新的应用程序。 这个事实标志着我们将使用的架构。 干净的建筑 我认为,根据我的经验,现代应用程序体系结构必须健壮,稳定,可扩展,可测试,适应更改和可维护。 我认为干净的架构可以提供所有这些功能。 基本上,干净的体系结构使用依赖规则将代码构建在同心层中: 内圈中的任何人都无法完全了解外圈中的任何事物。 特别是,在内圈中的代码不得提及在外圈中声明的名称。 其中包括功能,类。 变量或任何其他命名的软件实体。 只有一条规则! 太酷了! 👌内部层包含业务逻辑,中间层包含控制器和用例,外部层包含UI,框架,DB等。 当系统的任何外部部分(例如数据库或框架)变得过时时,都可以通过这种方式构造代码,您可以用最少的麻烦替换那些过时的元素 。 存档的一些关键技术优势包括: 实现的抽象 单一责任原则 关注点分离 解耦代码 在进行了这一简短介绍之后,让我们回到我们的故事! MVP +清洁架构 我们决定在两个平台上都使用ReactiveX来应用MVP和干净的体系结构。 我们还尝试在两个平台上保持相同的类和函数命名。 以这种方式保持两个平台同步对我们来说真是太棒了,因为当我们计划新功能或讨论错误等时,两个团队都在谈论相同的组件,相同的结构,几乎相同的方法名称,即使一个开发人员想要切换到在另一个平台上,这种方式要容易得多。 构成我们的体系结构的层是: UI层 域层 资料层 这是体系结构的方案: 让我们来研究一下: UI层 我们将MVP用于UI层。 我们使用依赖注入将依赖项注入到Presenter中,例如:用例,自定义对象等。 Presenter在用例和视图控制器之间居于中间。 它处理用户交互,启动适当的业务逻辑并将响应发送到视图控制器。 Presenter不会导入UIKit类以使其更具可测试性。 UI层具有与域实体不同的自己的视图实体。 域层 业务逻辑层。 每个用例都是执行特定业务逻辑的可重用且独立的组件。 域层对其他层一无所知,只是从定义为协议的存储库中获取数据并返回结果。 域层具有其自己的域实体,不同于视图数据实体。 资料层 它使用存储库模式(+ info)。 基本上,存储库模式在数据源上添加了一个抽象层,用例从中获取数据。 使用存储库模式,您只需一个入口即可查询来自不同数据源(核心数据,领域,Web服务器等)的模型对象。 业务逻辑不应该知道数据来自何处。 […]