使用Swift 3的IOS中的MVVM

当我们为最新的iOS应用程序奠定基础时,想向我们以前的iOS应用程序学习。 我们设定了两个目标: 避免Massive View Controller综合症 尽可能少的重复代码 iOS中的MVVM 自从最近出现更好的架构模式以来,MVC(模型视图控制器)设计模式就已经失去了其作为实际模式的地位。 现在,MVC被臭名昭著地称为Massive(或Messy)-View-Controller模式,其原因是在View控制器中堆积1000行以上的代码非常容易。 甚至苹果公司也以避开其示例代码中的MVC模式而闻名。 MVVM(模型-视图-视图模型)是一种体系结构模式,是MVC的替代方案,它可以使将ViewController的UI特定职责进一步隔离到视图模型变得更加容易。 在MVVM设计模式中, 模型与在MVC模式中相同,它表示简单数据。 视图由UIView或UIViewController对象以及它们的.storyboard和.storyboard文件表示,它们仅应显示准备好的数据。 ViewModel隐藏所有异步联网代码,用于可视表示的数据准备代码以及用于侦听Model更改的代码。 所有这些都隐藏在精心定义的API后面,该API建模为适合该特定View 。 使用MVVM的好处之一是测试,您可以在单元测试中更轻松地对其进行测试,而不会影响UI代码。 现在, 视图 ( UIViewController / UIView )变得更加简单,而ViewModel充当Model和View之间的粘合剂 。 在iOS Swift3中应用MVVM 如果您不熟悉MVVM,并且想深入了解如何在应用程序中实现和使用MVVM设计模式,请深入阅读本文,并附带示例示例。 我们将在此示例上演示iOS MVVM模式的用法。 简短地说,该应用程序显示一个用户列表,每个列表包含一个用户图像,其名称和电子邮件。 示例项目中使用的库: Alamofire:是一个用Swift(版本4.4)编写的HTTP网络库。 SDWebImage:该库提供了具有缓存支持的异步图像下载器。 Mapper:是一个简单的Swift库,用于将JSON转换为强类型对象。 步骤1:设定APIClient RANDOM USER GENERATOR使用的API,不需要密钥和授权令牌。端点是:http://api.randomuser.me/?results=10&nat=e 我编写了一个具有完成处理程序的downloadUser函数 。 JSON数据将以字典数组的形式返回,用于下面的关键“结果”。 步骤2:设置ViewModel。 #1:我创建了从NSObject继承的UserViewModel文件。 这将是我的View Controller中的属性,并由情节提要注入。 #2创建一个标记为@IBOutlet的apiClient属性,该属性将由情节提要实例化。 因为我知道情节提要将注入它,所以我可以使用(!)bang运算符,因为我知道它不会为零。 第3步:设置视图控制器。 用@IBOutlet声明UserViewModel属性,情节提要将实例化此ViewModel对象。 ViewDidAppear:在视图出现后调用-是使用userViewModel属性从API开始加载用户的好地方。 从API下载数据后,重新加载tableView以显示我们检索到的应用程序对象。 步骤4:如何使用情节提要定义Object属性。 从对象库中,将一个对象项目拖到视图控制器上,并将其插入VC的顶部。 […]

iOS 3.11

新: 历史记录备份使您可以在购买新的iPhone或iPad时随身携带所有对话,图像,视频和文件。 有关更多详细信息,请访问medium.com/@wireapp 改进的: 更改网络或脱机/联机不再影响应用程序性能。 Wire会遵循来电的iOS静音状态。 固定: 录制音频消息不再被传入的文本消息打断。 应用图标徽章偶尔显示错误的未读聊天次数。 通过Giphy发送的GIF没有设置动画。 用户注销时,应用有时崩溃。 在极少数情况下,所有参与者都被从聊天中删除,我们重新编写了造成混乱的代码。

[Workshop]导航器视图(快速)

目的 创建一个导航器视图并测试它是否可以导航回到上一个视图 方法 创建UI 2.在第一个视图控制器和导航控制器之间将segue的类型设置为“当前模式” 3.将条形按钮项Item放置到3rd View Controller中。 在第3个View Controller和最后一个View Controller之间将segue的类型设置为Show 测试 点击按钮,下一步 2.单击按钮,项目 3.单击按钮,返回

View Controller的基本生命周期

好的,这是View Controller的基本生命周期。 这是Apple的View Controller文档。 有一些不同的生命周期事件 – loadView 创建控制器管理的视图。 仅在创建视图控制器且仅以编程方式完成时才调用它。 – viewDidLoad 在控制器的视图加载到内存后调用。 仅在创建视图时调用。 – viewWillAppear 只要视图出现在屏幕上,就会调用它。 在此步骤中,视图已定义边界,但未应用方向。 – viewWillLayoutSubviews 调用以通知视图控制器其视图将要布局其子视图。 每次框架更改时都会调用此方法 – viewDidLayoutSubviews 调用以通知视图控制器其视图刚刚布置了其子视图。 视图布局其子视图后,请在此处进行其他更改。 – viewDidAppear 通知视图控制器其视图已添加到视图层次结构中。 – viewWillDisappear 在过渡到下一个视图控制器并且将源视图控制器从屏幕上移除之前,将调用此方法。 – viewDidDisappear 从屏幕中删除视图控制器后,将调用此方法。 通常,您可以重写此方法以停止视图控制器不在屏幕上时不应运行的任务。

踢您的手动迭代习惯

当约翰·巴科斯(John Backus)于1977年在他的ACM图灵奖演讲中问“编程是否可以从冯·诺伊曼风格中解放出来?”时,他肯定比40年后仍为for(i = 0; i < n; i++)写作的人寄予更高的希望。 冯·诺依曼(Von Neumann)编程语言使用变量来模仿计算机的存储单元。 控制语句详细说明其跳转和测试指令; 和赋值语句模仿其获取,存储和算术。 赋值语句是编程语言的von Neumann瓶颈,使我们可以一次单词的方式思考,就像计算机的瓶颈一样。 到2017年,主要的编程语言已经吸收了函数式编程中最实用的思想。 我在这里说服您,使用高阶函数来处理数据集合通常可以使您的意图比手动迭代更清晰。 从描述如何执行计算作为循环增加计数器的副作用,或者通过从键集中索引到字典开始,我们早就应该进行下一步了。 这种命令式风格要求代码的人工阅读者在脑海中模拟计算机的执行。 那是一件坏事! 取而代之的是在抽象阶梯上上移一个梯级,并根据功能组成描述您的计算工作:过滤,转换和减少输入流。 在我遇到的大多数情况下,数据存储在数组或列表中的事实是出于方便。 存储在其中的数据没有真正排序。 数组通常只是最易于键入的集合,因为所有语言都内置了语法糖。 最好将集合一般认为是容纳某些元素的容器。 在处理它们时,请开始考虑符合给定条件的元素集-这就是过滤器应用程序。 是否需要为每个元素计算一些派生值? 这种转换称为映射。 需要整个集合中的一些总价值吗? 那就是缩小或折叠。 学习这些概念,并使用它们更清楚地表达您的意图。 当您将计算作为增加索引的副作用时,了解它需要您逐步执行所有命令。 当您通过功能组合来表达自己的意图时,隐藏错误的空间就更少了。

未来就在眼前– iOS和异步开发

在编程中,我们经常使用异步操作。 这可能包括诸如网络,文件系统,数据库,UI,长时间运行的任务或任何其他I / O事件之类的东西。 在iOS中,我们有许多机制可以处理此问题,包括GCD,NSOperation,NSNotifications,委托和回调。 期货是一种在iOS上不那么常见的结构,但已经很成熟,在其他语言(例如JavaScript和Scala)中更常见。 也称为诺言,延期,任务或异步; 该技术允许您以同步方式处理异步值,将连续传递样式的调用切换为直接样式。 通过使用期货,您的程序将更容易推理,因为不会有太多的嵌套调用。 但是未来到底是什么? 未来是对尚不可用的值的表示。 当您与未来合作时,您将不知道该值当前是否可用。 但是,您可以使用该值,就好像它可用一样。 价值一经获得,将来便会处理您的指示。 期货框架 如果您想在iOS应用中开始使用期货,则可以选择以下两种不同的第三方库: – BrightFutures – PromiseKit – FutureKit – 递延 – 螺栓 根据您选择的库,您将有不同的设计选择可以使用。 例如,Big Nerd Ranch的Deferred库的灵感来自OCaml的Deferreds。 这意味着将来/延迟值不会说明异步操作是否失败。 要表示失败,您需要通过返回Result类型或类似的关联枚举来将其表示为值的一部分。 BrightFutures遵循Scala的承诺和未来,因此有一个隐含的理解,即每个未来都可能失败。 FutureKit和Bolts还包含“已取消”状态,该状态表示用户何时取消了将来/任务并且不再关心结果。 这些库可能具有不同的方法和设计目标。 但是,它们都解决了提供一个接口来表示异步结果并使用异步结果的相同问题。 它们还处理共同的任务,例如一起对期货进行排序,并行运行期货以及在特定线程上处理结果。 因此,让我们深入。 只是基础 使用期货的最基本方法是设置完成处理程序。 只要值可用,就可以简单地执行操作。 要设置处理程序,您可以在将来通过调用onSuccess (BrightFutures / FutureKit), 在 (Deferred), 然后 (PromiseKit)或continueOnSuccessWith (Bolts)来设置延续功能。 这些框架中的大多数还允许您通过调用onFailure (BrightFutures), onError (FutureKit)或catch (PromiseKit)来附加错误处理程序。 […]

技术堆栈摘要3:2017年4月

四月是一个繁忙的月份! 有太多很棒的技术堆栈帖子,以至于我们很难挑选十个。 到4月为止,我们总共有20个热门帖子,其中包括10个隐藏的宝石💎。 来自Netflix , Flipboard , Slack , Twitter , Yelp , Dropbox , LinkedIn,Shopify等的帖子 。 令人惊讶的是,四月份的一个主要主题是移动开发 。 LinkedIn,Yelp和Uber都写了关于Android的用法,而Uber则用Swift分解了对应用程序的重写,Shopify则写了关于构建移动CI系统的文章。 查看以前版本的Tech Stack综述 十大技术栈文章: 我们如何构建Twitter Lite(Twitter) 如果您还没有听说过,那么Twitter Lite是一种“快速且响应迅速,使用较少数据,占用较少存储空间,并支持推送通知和在现代浏览器中脱机使用的功能”,旨在成为您在使用Twitter时使用Twitter的最佳方式。连接速度慢,不可靠,受限或昂贵。 基本上,是精简版的Twitter。 Twitter将其构建为客户端JS应用程序,并使用React,Redux,Normalizr,Globalize,Babel,Webpack,Jest,WebdriverIO和Yarn构建。 作者 : 尼古拉斯·加拉格尔(Nicolas Gallagher) 技术堆栈 : React , Redux , Normalizr , Globalize , Babel , Webpack , Jest , WebdriverIO和Yarn Slack的TypeScript(Slack) 有人在打字TypeScript …事实证明,您一​​直使用的Slack桌面应用程序非常复杂。 这是一个多线程应用程序,使用JavaScript与Windows,macOS和Linux的本机代码进行交互。 Slack希望能够保证一切都能融合在一起,因此他们转向TypeScript […]

开发iOS应用-第2部分

这是示例屏幕截图。 一旦完成开发并为应用商店做准备。 使用Apple开发人员帐户,您可以将您的应用进行测试,然后要求测试人员为您执行测试。 发布: 乐在其中- 在应用商店中发布iOS应用 。 完成此操作后,您将成为iOS的正式开发人员和App的自豪所有者 。 但这当然也是最棘手的部分。 如前所述,在创建iOS应用程序的过程中,我学到了很多东西。 一个主要也是最重要的教训是 不要为这个过程留出一些时间,因为这不是一件容易的事。 我不会在这里涂糖衣。 很难将您的应用程序放入应用程序商店,尤其是第一次。 伙计们,现在不要责怪苹果公司的严格指导方针。 如果要保持App Store清洁,则需要它。 那为什么我说很难呢? 好。 因为要发布应用程序,有很多准则/规则。 这就是您需要的东西, 您将需要完成,运行良好且设计精美的iOS应用。 (当我说设计精美时,我是认真的,Apple希望您遵循他们的《 人机交互指南》 ) 然后,您需要注册Apple Developer Program 。 您将充分利用此功能,并在完成测试版后以及想要认真对待事情时(例如,当您要将应用程序放到应用商店中时)进行注册。(请记住, 每笔费用约为99美元年 ) 在开始发布之前,请仔细阅读《 App评论指南》 。 您不一定必须逐字逐句地进行检查,但是如果这样做,那就很好了。 虽然您开发了出色的iOS应用程序,但Apple会对您的产品进行评论,他们也必须有同样的感觉。 一旦他们批准了您的应用,该应用就会在应用商店中启动。 很多事情都会出错,但是最重要的是将应用程序带到商店 。 所以你不敢放弃。 预留大约2周的时间进行发布。 您可能需要与Apple团队来回交流,否则您可能会在第一次遇到问题。 但是要留出时间。 Apple的应用程序审查团队非常明确,可以让您知道他们对在应用程序商店中发布该应用程序的期望。 因此,与他们沟通并获得所有需要的清晰度。 苹果承诺将在24小时内对任何请求做出答复,最多2个工作日,并且他们确实做到了。 快速提示: 确保在Xcode中调试应用中的所有可能错误。 没有警告信息 ! 如果您上传的版本不是beta版本 ,则在应用程序或其描述中不会提及“ beta […]

获得iOS开发人员工作需要了解的三件事

找工作很难。 如果您花了很多时间浏览iOS开发人员的职位,您会发现所需技能列表非常艰巨。 您真的需要五年经验吗? 了解TDD是否有意义? 他们列出的所有那些框架呢? 他们有多重要? 看来他们还希望有人将应用程序运送到App Store。 您也需要这样做吗? 在我的生活中,有一点我看了看所有的东西,耸了耸肩,决定不申请。 然后,我负责并在业余时间系统地学习了其中的每一项技能。 这是我作为独立的iOS开发人员工作多年后发现的。 大多数职位发布都是心愿单,而不是硬性要求 技能清单并不是一成不变的。 它可能甚至不是由开发人员编写的。 您会看到,大多数开发人员都太忙了,以至于不愿意撰写职位发布。 在其他许多相互竞争的优先事项之间,我们的时间几乎被拉长了。 通常是这样的。 人力资源部的一个人问开发人员,他们在新员工中想要什么技能。 然后,开发人员会喷出任何突然冒出来的东西。 人力资源人员会编译一个列表,将其添加到职位发布中,并提供给所有人查看。 这样我们才能得到听起来像这样的职位 “我们正在寻找一位资深Rockstar iOS Ninjaneer,他熟悉通知,委托,表视图,配置,堆栈视图,TDD,Stacy提到的一件事和变量。 除非您有Swift十年的工作经验,否则请不要申请。” 同时,回到现实世界,事实证明, 您只有三项核心技能才能成为iOS开发人员。 这是因为大多数iOS应用项目都是同一事物的不同风格。 要了解优秀员工的模样,您需要了解一般的iOS应用项目 无论是供企业使用还是供消费者使用,大多数人都希望应用程序能够与Internet通讯。 结果,典型的iOS应用仅是围绕某种Web服务的漂亮外壳。 如果您接受这个前提,这三个技能将是最优先的 对Web服务的理解以及编写与之交互的代码的能力。 对关注点和设计模式(例如MVC和MVVM)分离的理解,可以加强这种分离。 了解对象持久性及其如何在iOS应用中实现。 而已。 这实际上只是三个核心技能。 让我们更详细地了解它们。 对Web服务的理解 要成为一名高效的iOS开发人员,您需要编写与Interwebs交流的代码。 这意味着您需要了解Web服务,REST API,数据库,异步进程和JSON。 您编写的代码将与这些东西交互。 除了iOS应用程序外,有些工作可能还需要您构建Web服务,但这并不是很常见。 通常,他们为此有一个单独的人。 关键是您需要知道那些东西是什么。 您需要花费大量的时间来构建可与Web服务一起使用的应用程序。 如何获得经验 我通常不会提倡这一点,但是到底是什么。 只需联系一些公司,告诉他们您正在学习iOS开发,并询问他们是否对开发人员进行了代码测试。 代码测试将告诉您获得该工作所需的一切。 大多数iOS代码测试都要求您编写一些示例应用程序,以与其示例Web服务对话。 它们是学习Web服务如何工作的好方法,而无需自己构建Web服务。 如果您可以在其时间限制下通过其中一项测试,那么您已具备基本的Web服务技能。 […]

Swift S中的信号量之美

在这个故事中,我们将执行以下操作 : 了解什么是信号量 了解信号量如何工作 实施并解释2个示例 开始吧 信号量使我们能够控制多个线程对共享资源的访问。 为了简单起见,让我们考虑以下现实情况: 一位父亲和三个孩子坐在家里,然后掏出iPad … 孩子2 :我想玩iPad !!! 小孩1 :不!,我想先玩… 孩子3 :Ipad! iPad! iPad! *掌声* 父亲 :好的,孩子2,因为您首先问过,并且目前没有人使用iPad,请拿走它,但是一旦完成,请告诉我。 其他孩子,请耐心等待。 孩子2: (5分钟后)我做完父亲了。 父亲:孩子1,有iPad,请在完成后告诉我。 孩子1: (5分钟后)我做父亲了。 父亲:孩子3,有iPad,请在完成后告诉我。 孩子3: (5分钟后)我做完父亲了。 在上述方案中,父亲是信号量,iPad是共享资源,孩子是线程。 注意父亲如何确保一次只有一个孩子使用iPad。 如果将此与编程进行比较,则一次只能有一个线程访问共享资源。 另外,请注意使用顺序,首先询问的是谁(FIFO)。 提示 :共享资源可以表示变量,也可以表示工作,例如从url下载图像,从数据库读取等等。 如果父亲只是把iPad给孩子们怎么办? 飞机飞行到可能损坏的iPad😖的地步。 如果将其与编程进行比较,则多个线程会尝试同时访问同一资源,并且没有任何阻止。 这种行为可能导致争用情况,崩溃,并且显然,我们的代码将不是线程安全的。 线程安全:可以从多个线程安全地调用而不会引起任何问题的代码。