Tag: mvvm

Swift Talk:高级MVVM [第4集] | 使用ViewModel插入,更新,删除,重新加载TableView

在这个有趣的情节中,我们向您展示如何处理UITableView功能,例如从视图模型中插入,更新和删除UITableViewCell。 我们还展示了一个有趣的排序方式,其中TODO项目根据“完成状态”进行排序,就像应用商店中提供的任何流行的TODO应用一样。 观看其他TOP编程教程,网址为: 轻松编写代码 来自行业专家的真实经验的视频教程。 Laravel,AngularJS,iOS,Android,NodeJS… www.youtube.com 请关注我们: http://letscodeeasy.com www.facebook.com/letscodeeasy https://twitter.com/letscodeeasy

Elm体系结构:将R隐藏在FRP中

函数式反应式编程在移动应用程序开发中风靡一时。 在我以前在Ackee工作期间,我们是ReactiveCocoa / ReactiveSwift的早期采用者。 最初,其他团队可能会因学习曲线而推迟,但到现在,大多数公司已经看到了某种形式的反应式编程,并且许多公司正在包括iOS和Android在内的不同平台上使用Rx框架。 MVVM-OOP的最后一口气 使用FRP,将所有不同的数据源连接到几乎是声明性的视图层就像以可观察的形式存储状态一样容易。 您只需要一个放置这些可观察属性的位置和一些将值填充它们的业务逻辑即可—您需要一个ViewModel。 但是MVVM有它的问题。 您可以以一种方式绘制所有箭头(即View-> ViewModel-> Model ),但是在另一个方向上仍然存在通信。 您声明了反应式绑定,而不必理会它们,就像箭头没有出现一样。 它只是有效…除非出现死锁。 更糟糕的是,找到此类死锁的根源(无论是递归事件还是在错误的时间发送多个信号)都不是最困难的问题。 修复它。 通过使用反应式框架,您已经声明了代码可以处理我们向其抛出的任何输入, 无论何时我们 选择扔它。 除了现在,它不能。 您应该如何解决这个问题? 一个简单的skipRepeats()有时会有所帮助,但有时您最终会编写诸如.skip(first: 2)或.delay(0.0, on: QueueScheduler.main)并祈祷该项目在无法管理之前结束。 此外,ViewModels是对象。 您已经在内部用FRP替换了OOP,但是您的应用仍然由这些需要协调的有状态的参与者组成。 当两个ViewModel需要共享某种状态时,您可以掷硬币— “头说我们将其放在’服务’中,尾部是’经理’”。 无论哪种方式,它都是另一个有状态的对象。 这些之间的通讯又如何呢? 您是否曾经想过编写ManagerManager? 在撰写有关iOS应用程序体系结构的文章时,我已经知道这是我对MVVM的再见。 我对此非常满意,赞赏过去几年为我所做的一切。 但是现在该继续前进了。 现在该摆脱所有这些行为,反应,通讯,同步并导致不一致和死锁的对象了。 现在该停止像没有并发那样行动,而要真正做好随时准备参加任何事件的准备。 效果也可以将事件反馈到程序中,视图也可以。 效果分为命令(用于发出HTTP请求)和订阅(用于侦听数据更改(套接字,本地和远程数据库等))。 因此,我们的最终更新层如下所示: func update(来自模型:Model,带有msg:Msg)->(Model,Cmd ) func订阅(用于模型:模型)-> Sub 和我们的视图层: func view(for model:Model)-> ViewDescription 我失去了时间。 本文越来越长,但这不是我的意思。 我过去是将FRP出售给学生的是功能编程+时间 。 […]

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种不同的实现,每种都有各自的优缺点。

MVVM-1:一般性讨论

哦,我的……我们今天所拥有的……另一个关于MVVM的博客。 有什么新鲜事,否则它会讲同样无聊的事情。 是的,那么一件事是,我们的旅程将是漫长而冒险的,并且会围绕MVVM公园进行详细的游览。 我们不仅会学习基础知识,甚至还会尝试使用复杂UI的实时应用程序场景。 让我们继续进行MVVM冒险.. !!!! 听起来有点有趣;)。 是不是 MVVM或模型—视图— ViewModel是一种设计模式,旨在模块化您的代码并将其构建在测试驱动开发环境中。 当苹果公司的传统MVC设计模式使我们的控制器笨重且单元测试痛苦时,诸如MVVM,VIPER,MVP等不同的设计模式便应运而生。 MVVM非常方便,因为它在所有组件之间提供了松散耦合的机制,将您的视图,业务和数据逻辑隔离开来。 有很多教程和博客对此进行了解释,但是在这里,我们将遵循MVVM的基本规则,并学习如何尊重它们并编写漂亮的代码。 我们将分两部分讨论MVVM: 第-1部分讨论了有关MVVM和小型演示代码的大量讨论。 第2部分 将通过一个复杂的UI示例来处理MVVM中一些常见的漏洞,以及解决这些漏洞的方法。 你会学到什么? 我们将在示例的第-1部分中学习以下内容 什么是MVVM? 为什么选择MVVM? 我们将构建一个示例示例。 MVVM的一些缺点。 什么是MVVM? 模型: 模型基本上是应用程序具有的数据模型或实体。 它们只是具有简单关联属性的结构或类。 通常,它们只是保存从原始数据结构映射的数据,这些数据可能来自您的API或其他来源(例如SQLite文件等)。 查看或查看控制器: 视图是显示的视觉元素。 应用程序屏幕上的所有UI组件都是视图。 该视图仅包含UI逻辑,例如数据渲染,导航等。 该视图拥有视图模型。 查看模型: 视图模型接收UI事件并执行业务逻辑,并提供要在UI上显示的输出。 这是负责处理驱动视图的业务逻辑的组件。 但是它在内部不会修改UI,也没有对视图的引用。 它拥有数据模型。 为什么选择MVVM? 好的,我们当中有些人可能会问,当苹果公司提供了美观且更简单的MVC时,为什么还要使用MVVM。 我们可以集成一些不同的设计架构,例如Facade,Coordinator,Singleton等,以构建模块化代码。 好的,现在有以下三个原因使MVVM脱颖而出: 隔离代码:隔离代码 。 基于MVVM组件将特定的视图处理划分为跨视图,模型和视图模型的部分,从而为我们提供了模块化的代码结构。 避免使用笨拙的控制器:使用MVC的开发人员知道,当我们的应用程序可扩展且需求不断与我们现有的逻辑混乱时,我们的控制器将继续扩展,直到并且除非将控制器代码路由到单独的文件中。 通过MVVM,我们在视图模型中写下了业务逻辑,仅将输出传递给视图或控制器。 测试驱动开发 : 最重要的是,MVVM确实提供了执行TDD的良好平台。 我们可以写下用于视图模型的单元测试用例,并测试驱动UI的业务逻辑。 单元测试用例在开发时确实非常重要,因为它们在很大程度上减少了我们的破码机会。 请点击以下链接在iOS中探索有关TDD的更多信息 iOS中的测试驱动开发,SWIFT 4-第1部分 […]

带有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数量:整数 […]

Swift-MVVM Mimari Deseni

MVC’iduymuşsundur,bildiğinüzeregünümüzdefarklıplatformlardaoldukçayaygınkullanılanmimari deseni。 Peki ya MVVM desem? Buyazıda,模型视图控制器(MVC)和iOS模型视图大规模(iri / hantal)diyeadlandırdığımız模型(Massive)-ViewController’ı(M-VC)elealıyoruz。 Yazılankodlarıntest edilmesi konusundakarşılaşılanproblemleriçözmekiçin模型-视图-视图模型(MVVM)mimarisine nedenihtiyaçduyduğumuzuve bu mimariyinasılkullanacağımızimbir projeüzerinden。 İlginiçektiyse,Başlayalım。 模型视图控制器,模型视图控制器(.NET,Swift,Java,Obj-C)库兰尼兰(Kullanılanoldukça)yaygınbir mimaridir。 MVC mimarisinintasarımamacı, geliştiricilerinuygulamaarayüzlerinihedef projeye kolaycauygulamasıvekullanıcıyasunulanarayüzile verilerin birbirindenayrılmasıdiyebiliriz。 标准模型视图控制器: MVC deseni 3 Katmandan -layer / component-oluşur,bunlar: 型号: Gorevi uygulamatarafındankullanılanverilerinsaklanmasıdır。 控制器tarafındanverilerinokunmasınavegüncellenmesineolanaksağlar。 Tek birsınıftanveya birbirleriyleilişkilisınıflartopluluğundanoluşur。 视图: Göreviverileri okuyupsunmaktır。 查看katmanı,儿子kullanıcınıngördüğüveetkileşimhalindeolduğugörselbilesenleriyönetensınıfveyasınıflarbutunudur。 负责人: Model ve View,负责人,kullanıcıgirdileriniyönetir,负责人Model -i ve -gerektigi taktirde- View’igüncellemektensorumludur。 逻辑网络的连接是控制者,她的控制者是她的管理员,而管理员则是其他人。 […]

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

带有RxSwift的MVVM:用户登录

您是否厌倦了使用相同的旧MVC架构模式来开发iOS应用程序,并且足够开放以尝试新的模式,所以嘿! 你是在正确的地方。 注意 :如果您不知道RxSwift是什么,那么我建议您通读我以前的文章,它将带您了解RxSwift的一些非常基础的知识,以便您对我在本文中要解释的代码感到满意。 RxSwift:观察运算符✅ 如果您来自编程背景或具有某种专业知识,那么您一定一定会遇到…… medium.com 现在,我假设您对RxSwift的功能以及如何使用它有一些基本的了解。 因此,现在继续前进,在深入研究一些编码之前,请先讨论MVVM(模型-视图-ViewModel)体系结构。 MVVM与MVC非常相似。 它描绘了视图和控制器的紧密耦合本质,并引入了一个新组件。 在MVVM下,View和ViewController彼此紧密相连,我们将它们视为一体。 视图仍然没有直接引用模型,控制器也没有。 相反,他们引用了新组件ViewModel 。 ViewModel 是放置您所有用于用户输入的验证逻辑,用于视图的呈现逻辑,任何网络请求的发起以及其他各种代码的绝佳场所。 不属于ViewModel的一件事是对视图本身的任何直接引用。 ViewModel中的逻辑在iOS上应与在OS X上一样适用。(换句话说,不要在视图模型中#import UIKit.h,就可以了。) 由于表示逻辑(如将模型值映射到格式化的字符串)属于ViewModel,因此ViewController本身变得far肿得多,代码行数少了。 最好的部分是,当您开始使用MVVM时,您只能在ViewModel中放置少量代码逻辑,当您对范式更加满意时,可以将更多的代码逻辑迁移到它们上。 使用MVVM编写的iOS应用程序具有很高的可测试性。 由于视图模型包含所有表示逻辑并且不引用视图,因此可以通过编程对其进行全面测试。 从理论上讲,现在是时候让我们掌握一些代码示例了,这将使您快速了解如何有效实施MVVM。 LoginModel是一个存储登录凭据(即用户名和密码)的类。 LoginViewModel: 这是主要的ViewModel,它实际上处理Login视图上的所有用户交互。 在这里,我们创建了密码和电子邮件视图模型的实例,还定义了可观察对象,即将 变量绑定为 isSuccess,isLoading,errorMsg ,并将其绑定到视图以进行响应数据更改。 在validateCrentials()函数中,我们实际上通过调用相应的ViewModel函数来比较字段值。 最后, loginUser()使用值初始化模型,然后创建对包含电子邮件,密码的api的请求,最后启动API请求。 无论是成功还是失败响应,我们都会更新我们之前在案例中定义的可观察对象isLoading,isSuccess,errorMessage ,它们使用绑定立即反映在视图中,从而使其具有反应性。 现在,最后我们进入视图,即ViewController,其中ViewModel以反应方式反映数据。 在createViewModelBinding函数中,我们将电子邮件和密码字段与各自的ViewModel的数据变量绑定在一起,简而言之,将文本字段的文本和数据变量值保持同步。 因此,当电子邮件文本字段的值更改时,数据变量值也会更改。 登录按钮的点击监听器首先通过self.emailTextField.resignFirstResponder()关闭键盘,然后验证凭据并相应地调用loginUser函数进行处理。 在createCallbacks函数中,我们订阅了isSuccess和errorMsg可观察的对象,因此,如果其值发生任何更改,我们都将在View中进行回调,并可以执行该过程。 到此为止,希望您能从中学到一些有用的东西。 因此,如果您有任何想法和意见,请随时在下面发表评论。 别忘了通过多次鼓掌来分享您的爱。 您可以在 Twitter,Github,LinkedIn,Facebook 上关注我 。 快乐编码👨‍💻。

应用数据流:第一部分

与商店合作 示范代码 在我们陈述之前,如果您在标题中看到商店,并认为这与商务应用程序有关,那么不幸的是,事实并非如此。 在这种情况下,Store是针对组织用于应用程序的数据的存储和检索的特定方式。 好的,既然我们已经解决了这个问题,那么今天我们将要讨论应用程序数据流。 虽然这个主题听起来可能并不超级有趣,但是从长远来看,很好地处理流经应用程序的信息流将为您节省大量时间。 乱序 在开始构建之前,您多久坐下来勾勒出一个应用程序的大致轮廓? 经常? 一点也不? 如果是定期的,那么有多少时间用于映射数据和应用程序状态,以及有多少时间在计划UI上? 事实是,花时间计划数据的人并不像在UI上那么多。 为什么不呢?有很多很棒的工具,例如Sketch,可以用来计划UI,还有很多博客和其他资源,可以用来学习更多有关计划UI的信息。 计划数据并不是乐趣的一半。 但是,如果您做得正确,花时间去做将为您节省两倍的麻烦。 组织混乱 如果您考虑一下,那么一开始没有太多经验并在iOS中使用MVC作为指导的人可能会以多种方式构造代码。 没有什么限制甚至路标可供他们遵循。 清晰可见的路标通常像救生筏一样被抓住。 这就是为什么这么多的初学者代码最终出现在ViewController中,尤其是viewDidLoad中的原因。 没有太多其他参考,这成为他们的组织原则。 开放的画布 除了基本UI类的实现之外,作为程序员,您几乎没有做出任何决定。 刚开始时,打开的画布通常是挫败感的源头,因为在那个阶段,您真的想知道应该去哪里。 但是,有了这个自由空间,您会感到更加舒适,这为您提供了一个探索的好地方。 MVC 对于此示例,我们将使用接近普通MVC的内容进行处理。 过去,我必须承认,我对iOS使用的标准MVC抱有不必要的苛刻意见。 主要是由于我自己的不耐烦。 只要有一点时间,加上适当的实现,MVC就能很好地工作。 尽管在演示项目中有视图模型,但是代码没有什么特别的花哨,没有RxSwift,也没有协调器。 出于所有目的和目的,它都是原始的MVC,因此tableview单元模型的结构如下: 数据流 在继续之前,我只想澄清一个术语:数据流。 当我指的是应用程序中的数据流时,我指的是如何将数据从源头传递到应用程序以进行显示以及其结构。 它涵盖了从API响应到数据模型乃至数据呈现的所有内容。 就其重要性而言,它并没有获得应有的价值。 我愿意打赌,当我第一次学习网络电话并开始构建更复杂的应用程序时,我经常会遇到很多麻烦,这是因为我并没有真正考虑数据将通过应用程序的方式。 希望它将变得更加清楚演示代码的重要性。 同步器 同步器是一个类绑定协议。 实施后,它将允许您的控制器预订正在更新数据模型的对象。 这样,它就可以采取相应的行动。 在我给出的示例中。 当数据模型添加新项目时,将通过其与Synchronizer的订阅来通知控制器。 然后,它可以同步数据和视图。 同步 同步维护控制器和更新数据的对象之间的连接。 当您认为数据已完成更新时,将发送同步消息。 这可能在API调用或CoreData提取的末尾。 商店 商店协调流程并保存数据。 在基本形式中,它只是定义某些特征的协议。 当您针对特定数据和任务实施它时,它将变得很有用。 物品商店 […]

在几分钟内通过RxSwift将MVC iOS应用重构为MVVM

MVC是Apple在开发iOS应用程序时向开发人员推荐的应用程序体系结构。 它提供了视图,模型和控制器之间的清晰分隔。 控制器位于中间,充当视图和模型之间的粘合剂。 从模型到视图的几乎所有逻辑数据转换都被扔到控制器内部。 随着功能和需求的增长,视图控制器在逻辑,状态管理,数据转换等所有方面变得非常庞大,它将紧密耦合在一起,并且很难作为一个整体进行测试。 尽管并非总是如此,但是如果我们认真地正确管理它。 有关更好的MVC,请参见Dave De Long博客文章。 更好的MVC,第2部分:修复封装 关于“修复”模型视图控制器的系列文章的第2部分:更好的MVC,第1部分:问题,更好的MVC,第2部分:修复… davedelong.com MVVM简介 模型视图视图模型是一种应用程序体系结构,最初由Microsoft于2005年通过其.NET框架首次发明,以构建事件驱动的用户界面。 MVVM作为一种体系结构提供了许多主要职责,例如: 作为提供应用程序状态表示形式的接口。 作为从模型显示的数据转换的管道,将显示到视图中。 使用MVVM,所有从模型进行的数据转换(例如,格式化日期要在UILabel显示为文本)将由视图模型实现,并作为属性公开给控制器。 View Controller的职责是配置属性,将视图模型中的属性绑定到视图中,并将所有操作从视图发送回视图模型。 这样,应用程序状态将始终在视图和视图模型之间保持同步。 有几个重要的规则适用: 模型归视图模型所有,并且对视图模型一无所知。 View Model由View Controller拥有,它对Controller一无所知 控制器拥有视图模型,并且对该模型一无所知。 MVVM提供了更好的业务逻辑封装和来自模型的数据转换,并且作为一个单元进行测试也非常容易。 并非所有的View Model都需要提供对其属性的绑定,它仍然可以是一个轻量级的对象,可以用来通过数据转换配置视图,正如我们稍后在构建应用程序时所看到的。 有几个绑定选项可用,例如使用键值观察和闭包。 在本文中,我们将使用RxSwift库提供可观察到的反应性序列来构建我们的MVVM应用程序。 我们将建立什么 在本文中,我们将把使用MVC作为其应用程序体系结构的当前iOS应用程序重构为MVVM。 这是一个电影信息应用程序,它使用具有以下主要功能的电影数据库(TMDb)API: 按最新趋势,最受欢迎和最近的时间获取电影列表。 使用搜索栏搜索电影。 我们将看到MVVM体系结构将如何帮助我们构建更轻便的视图控制器和一些各自负责的视图模型。 请注册并从TMDb获取您的API密钥。 https://www.themoviedb.org/documentation/api 您可以在下面的GitHub存储库中克隆入门项目: alfianlosari / MovieInfoStarterProject 电影信息MVVM启动项目。 通过在… github.com 上创建一个帐户为alfianlosari / MovieInfoStarterProject开发做出贡献 入门项目 入门项目使用情节提要来配置其视图控制器。 偷看Main.storyboard文件以查看配置。 该应用程序的初始视图控制器是一个带有两个子控件的Tab Bar控制器,每个子控件都嵌入到导航控制器中。 […]