Tag: iOS应用开发

Swift中的设计模式集合

我发现很多人通过搜索引擎访问了我在Swift中有关设计模式的文章。 因此,我在本文中收集了它们,以使读者可以轻松找到它们。 谢谢。 创作模式 Swift World:设计模式-简单工厂 如果我们想学习一种编程语言,我们需要忍受它。 这意味着尽可能多地使用Swift。 今天… medium.com Swift World:设计模式-工厂方法 您还记得我们在上一篇文章中讨论的简单工厂模式吗? medium.com Swift World:设计模式-Singleton 辛格尔顿在可可中非常受欢迎。 我们可以找到不同的用例。 以下是两个示例。 medium.com Swift World:设计模式-生成器 通常,在制造汽车时,我们首先制造每个零件,然后组装它们。 作为客户,我们不需要… medium.com Swift World:设计模式-抽象工厂 今天我们将讨论抽象工厂模式。 它处理更复杂的用例。 众所周知,轿车… medium.com 结构模式 Swift World:设计模式-适配器 我们已经完成了创建模式,并将在本文中介绍结构模式。 从字面上看,结构性… medium.com Swift World:设计模式-桥梁 您还记得我们的汽车系统结构吗? 我们有一个协议和不同的实现方式,例如下面的代码。 medium.com Swift World:设计模式-装饰器 装饰器是一种结构化模式,可在运行时向类或实例添加新功能。 与继承相比,它具有… medium.com Swift World:设计模式-外立面 从字面上看,facade表示 medium.com Swift World:设计模式-代理 今天,我们将讨论代理模式。 在这种模式下,代理是一个对象,可以帮助我们访问另一个对象。 […]

Swift中的数据源…或如何避免这种新的时尚持久性框架决定了您应用的架构

该帖子最初发表在dcordero.me中。 在这里,您将始终找到更新的版本。 在iOS的世界中,确实有很好的框架来处理数据的持久性。 例如,Core Data是Apple提供的出色解决方案,即使在处理大量数据时也能提供令人难以置信的出色性能。 但是也有其他一些替代方法出现。 这些选择之一是Realm,据说它以更简单的语法提供比Core Data更好的性能。 但是可悲的是,在这个持久性世界中,没有什么能像预期的那样精彩。 还有很多问题。 我对Core Data,Realm或其中许多其他流行的持久性框架有非常不好的经验,这当然不仅是因为框架本身,还因为它们是如何应用于项目的。 主要问题在于,由于这些框架解决的问题非常复杂,因此它们倾向于具有相当复杂的语法。 而且,如果框架的范围没有明确定义,那么最终它们的对象往往会散布在整个项目中,找到从NSManagedObjects获取数据的UIView,使用RLMObjects填充单元的UICollectionViews等。 这种情况永远都不会发生,应用程序的持久性应该是非常内部的东西,应该隐藏在应用程序核心部分的最深层中,当然也不要与我们的UI层产生冲突。 最重要的部分是,将来替换掉所有这些代码部分以使用任何其他解决方案或框架应该非常容易。 这听起来像乌托邦,对吗? 但是……我们如何得到这个? 我们基本上只需要一个抽象解决方案,该解决方案定义一个接口来处理数据的持久性。 我的意思是使用数据源 。 注意:请不要将此数据源的概念与iOS用于填充某些TableViews,CollectionViews等的数据源混淆。 数据源 数据源从核心业务逻辑中提取持久性逻辑,并且无论框架的具体细节如何,都可以访问数据。 我们可以在Swift中使用非常简单的协议构建一个接口来管理数据源,该协议提供了完整的CRUD(创建读取更新删除)接口。 作为免责声明,我想在示例中保持简单,但是您是否听到了`BooksRealmDataSource`? 没有? 仿制药真的大声尖叫,不是吗? 🙃 储存库模式 现在,我们不必担心框架…想象一下让您的App的所有数据源实现先前协议的情况。 我的意思是,无论最终来自何处,总是以完全相同的方式访问信息。 磁盘,内存甚至网络。 它们全部来自完全相同的协议。 构建一个存储库 模式非常容易,该存储库 模式通过不同的数据源进行迭代可以从每种情况下从最快或更合适的源获取数据。 我们的存储库的实现再次要求泛型,只是收到泛型应管理的数据源列表以及适用于它们的策略。 例如,在上一个示例中,要获取我们的图书清单的存储库可能具有3个不同的数据源:内存,磁盘和网络。 具有首发比赛的策略。 但是用于进行用户登录的存储库将只有一个数据源(网络),以确保我们始终通过后端验证凭据。 最后,从应用程序的其余部分开始,这意味着无论数据来自何处,或内部使用了哪些框架,都使数据如魔术般神奇。 正是我们想要的数据。 就像我说的,最好的部分是,遵循这种模式,我们获得了巨大的模块化,并且我们可以在需要时很容易地更改内部实现。 您想尝试一下X新的流行框架吗? 好吧,只需更改您的一个数据源的实现,该应用程序的其余部分将完全不需要任何更改。

iOS面试问题第1部分:与众不同

iOS域非常庞大而深刻。 如果您正在寻找适合初学者或有经验的iOS开发面试问题,那么这里是正确的地方。 我已经准备了一些问题,并在各个部分进行了分叉,将一个故事组合在一起将无法证明该主题的合理性。 在这一部分中,我们将区分iOS中的许多已知术语。 我们遇到了许多看起来或听起来相似但略有不同或完全不同的术语。 这部分将主要关注iOS Core开发和Objective-C。 特定于Swift的术语将在单独的部分中进行讨论。 🙂 问:@合成VS @动态 @ synthesize将在编译时为您的属性生成getter和setter方法。 @dynamic只是告诉编译器,getter和setter方法不是由类本身实现的,而是由其他地方实现的(例如超类或将在运行时提供)。 @dynamic的用法例如与NSManagedObject (CoreData)的子类一起使用,或者当您要为由超类(未定义为插座)定义的属性创建插座时。 问:XIB VS NIB XIB(XML Interface Builder)是Xcode中的可执行代码。 它的大小比笔尖大。 这些是平面文件和XML文件 NIB(Nxt Interface Builder)是不可编辑且不可操作的文件。 它们的尺寸较小。 这些是二进制或存档文件。 编译后,XIB转换为NIB。 问:NSInteger VS Int VS NSNumber NSInteger是一种描述整数的类型定义,但它并不等效于64位平台上的int 。 在构建32位应用程序时将其定义为int ,对于64位应用程序则将其定义为int 。 大多数情况下,您可以使用NSInteger替换int,但这样做时需要考虑一些事项。 Int是原始数据类型。 NSNumber将数字类型存储为对象,并且可以转换为其他格式。 它还可以检索字符串表示形式。 问:任何VS任何对象 根据Apple的Swift文档: Any 可以代表任何类型的实例, 包括函数类型和可选类型。 AnyObject 可以代表任何 类类型 的实例 。 查看更多详细信息。 […]

使用Alamofire和EVReflection自动映射和解析JSON

我经常使用Alamofire进行HTTP联网,这是用Swift编写的流行联网库。 因此,它是极其强大的库,易于使用,但是在进行网络操作时,我经常需要抽象层来封装Alamofire而不是直接调用它。 我在过去的项目中确实使用Moya作为抽象,所以基本上,它提供了Manager类来定义端点,请求参数等的明确用法。因此,我确实创建了自己的Manager单例来管理这些东西。 在设计模型时,我们需要为每个请求的JSON值实现映射,并为我的模型实现响应周期 ,但是如果响应JSON结构经常更改(需求可以快速更改,可以快速转换请求/响应),那将是痛苦的。 我以前有在Swift中使用Reflection的经验,所以确实有机会在新项目中尝试EVReflection。 什么是EVReflection? EvReflection是一个带有反射功能的Swift帮助程序库,该功能支持NSCoding,Printable,Hashable,Equatable和JSON。 将基于NSObject的对象解析为字典。 将字典解析回一个对象。 从字符串值创建一个类并获取一个类的字符串值。 支持NSCoding方法encodeWithCoder和decodeObjectWithCoder 使用所有属性时,支持可打印,可哈希和等于。 (支持Swift 1.2中的Set) 将对象解析为JSON字符串,并将JSON字符串解析为对象 从EVReflection中裁剪 实施请求/响应模型 首先,我们需要设置从EVReflection(EVObject)基类继承的请求/响应模型。 适用于所有请求的BaseRequest,适用于应用程序中所有响应的BaseResponse以及用于解析错误JSON结构 (如果存在)的ErrorResponse (如果接收到用于警报,通知等的错误响应对象) 因此,如果JSON中包含错误有效负载以进行映射,则需要对其进行解析。 我们可以传递额外的默认值,例如应用程序的当前版本,内部版本号或任何其他数据。 然后,在下面的示例中,我们可以简单地声明从BaseRequest / BaseResponse类继承的Request / Response模型。 因此, 从EVObject继承的模型将自动进行映射 。 另外,如果您需要使用某些值作为请求/响应,我们可以通过实例化类来设置默认值 最后,定义一个采用请求参数(BaseRequest)和完成处理程序响应(BaseResponse)的方法为我们提供了完成处理程序。 (我们也可以在此处进行网络状态检查等。) 好处 我们不需要为模型编写映射或为JSON响应(以及请求)使用某些映射库。 我们确保正确定义了请求/响应周期 ,我们完全知道请求的内容,并且知道响应应该做什么。 我们确实使用可达性检查了网络状态 (您可以自己实施) 我们通过Alamofire的validate()方法确保它是经过验证的响应。 它会自动验证 200…299 范围 内的状态码 ,并且如果提供的话,响应的Content-Type标头与请求的Accept标头匹配。 我们有AccountResponse(BaseResponse)和错误(如果有)作为响应 我们使用了AlamofireJSONToObjects库, 该库使用EVReflection (作为Alamofire扩展名) 将JSON响应数据转换为Swift对象 。 我们拥有干净,可测试的实现,可以重复使用以支持不同的API请求。 这是创建请求的示例方法 […]

2018年,美国和印度有哪些最佳iOS应用开发公司?

作为居住在美国的客户,我曾经与许多本地和全球公司联系。 根据我作为B2B客户的经验,与美国的本地公司打交道是一件昂贵的事,但与质量和负担能力有关的跨国公司是与印度知名公司打交道的绝佳选择。 在众多公司中,我发现了一颗宝石,近十年来一直为我提供出色的解决方案,这就是美国圣何塞的Perception System。 它与艾哈迈达巴德的一家印度公司进行了巨大的合作。 但是,我的兴趣是与它在美国的本地分支机构互动,主要是在线交流,有时是面对面的交流。 我在整个团队中的客户体验是同等的,当移动应用程序开发项目出现问题时,我将其排在我的榜首。 因为团队迅速而轻松地解决了我很多艰巨的问题,这给我留下了深刻的印象。 自第一个iPhone SDK发布以来,iOS开发人员团队已开始为iOS应用程序开发做出贡献。 因此,他们经验丰富的iPhone应用程序开发人员和iPad应用程序开发人员已经见证了iOS应用程序开发市场的完整兴衰。 稳定和支持的团队 这是一支稳定可靠的团队,因此您在维护任务期间会遇到同一位iOS开发人员,该人是第一次为您的iOS应用程序编写代码的。 礼貌和快速响应的行为赢得了我们的心,因为我们经常在离岸平庸的软件开发公司中遇到糟糕的经历。 根本不是这里。 热情的问候和笑脸正等待着最新的视频聊天软件和各种通讯渠道,而在美国,我们最喜欢在这里使用它们。 明智而经验丰富的团队 iOS移动应用程序开发团队对美国乃至全球的本地企业,行业和组织有透彻的了解。 文化,社会和经济方面因国家/地区和地区而异,并且它们已经掌握了几乎所有的时间步伐以及与国际客户的互动。 因此,他们的业务分析师可以轻松将iOS应用程序项目的独特需求转换为技术全面的文档,这些文档成为您iOS应用程序整个生命周期的基础。 专家团队 除了普遍的了解之外,iOS应用程序设计团队和iOS应用程序编程团队在设计和编码方面都有诀窍,可以轻松,快速地处理大规模和复杂的项目。 iOS应用开发技术,团队工具和技巧的熟练掌握使您即使在集成最新技术的情况下也能在自己的漂亮市场中赢得比赛。 因此,他们是基于位置的应用程序开发,IoT应用程序编程和AI集成的先驱。 他们使我的许多客户满意,他们要求AR / VR集成,可穿戴式应用程序的开发,以及在即将到来的技术和趋势方面的更多要求。 除了对各种Web和移动应用程序开发技术的命令外,Perception System的软件开发人员还拥有在各个行业和垂直领域的长期经验,因而获得了丰富的领域专业知识。 它使它成为一家具有良好形象的未来派公司。 它在软件开发领域已经花费了超过17年的时间,在全球800多家客户中交付了超过3K个项目,创下了记录。 它的各种实验室聚集了113多个创新思维,他们除了提供常规开发服务外,还必须提供七个以上的现成软件解决方案。 我遇到的最可爱的事情 在结束讨论时,我将列举一些值得注意的工作趋势,例如: 他们始终密切关注每个细节,并尊重客户及其业务团队的反馈。 他们通过最新的PMS和沟通渠道使整个团队都可以访问,从而使客户成为开发团队的活跃团队成员。 他们提供前期咨询服务,使顾客能够在跳入开发板之前做出明智的决定。 通过为经验丰富的团队负责人和项目经理提供舒缓的方法和完整的技术指导,他们对非技术客户的支持非常丰富。 他们在开发过程中的透明度是无与伦比的,并且报告是惊人的。 来源网址

Baya,Swift的布局框架。

思想和基准。 这个主意。 Baya的想法可以追溯到2016年6月。具有讽刺意味的是,Android开发人员Backstage Podcast的第50集-最重要的是ContraintLayout ,这个概念与Baya完全不同。 进入事件大约15分钟后,讨论转移到一些基本原则,例如将视图层次结构与布局层次结构分离以及它们称为“虚拟视图组”的概念。 切特总结了这部分内容: “因此,它为您提供了从ViewGroups或单独的布局获得的封装,而在这些嵌套的东西的视图层次结构中没有额外的开销” 但是,这就是事情。 我真的很喜欢查看布局代码,并且能够快速推断出布局的外观。 使用ContraintLayout至少可以使您摆脱ContraintLayout 。 当使用这样的系统时,我最终会使用可视化编辑器。 梦想是保持可读性,但将布局和视图层次结构分开。 Android和Java的问题是,要么在实现适合现有系统的布局类时扩展View ,从而根本不展平视图层次结构,要么子类化我们要使用的每个View类我们的布局系统,以使它们实现新的界面。 两种选择都没有太大意义,就是这样。 当我和JoachimFröstl开始为iOS开发时,Swift改变了所有这些情况。 轻量级结构以及使用扩展添加协议一致性的能力正是我们所需要的。 我们从编写一个简单的协议和一些扩展程序开始,使我们的生活更轻松-没多长时间,Baya诞生了。 这个概念。 Baya围绕一些原则构建。 它们都起源于核心思想,除了最后一个更像是表现。 通过分离布局逻辑的平面视图层次结构。 通过将布局代码封装在具有描述性名称的结构中,以提高可读性。 通过面向协议的可扩展性。 一个人应该能够编写自定义封装的布局逻辑并将其插入。 布局定义,测量阶段和布局阶段的分离。 一个例子。 每个UIView都是一个BayaLayoutable 。 您可以在BayaLayoutable或BayaLayoutable的数组上调用Extension函数来创建布局。 这些布局还实现了BayaLayoutable 。 最后,通过调用layout?.startLayout(with: bounds)在layoutSubviews()或viewWillLayoutSubViews()启动布局例程。 如果需要度量通过的结果,例如在sizeThatFits() ,请调用layout?.startMeasure(with: size) 。 在100个子视图中具有19毫秒的时间,看来Baya是使用上述实现方式禁食的对象。 介意的不是很多,但是我们就在PinLayout的正下方。 这是另一款配备iPhone 6Plus的手机(我周围有一个)。 我认为这几毫秒不会带来很大的变化,因此请以该基准为准。 如果您有兴趣,请查看回购-如果您认为我在某处作弊,请在下面发表评论! 谢谢阅读! 我希望您喜欢阅读本文。 将这些想法写下来然后忘掉是很有趣的。 截至撰写本文时,Baya仍为0.2.0版本。 我们在两个项目中使用了它,并且很享受与它一起工作。 一些布局挑战使我们几次改进了API。 由于我们大部分时间都是自己使用Baya,因此我们没有得到太多反馈,也不想暂时锁定API。 在代码库中发现令人尴尬的错误? 对概念还是徽标中的酷鸟有什么想法? […]

Kin-与.pbxproj合并的头痛药

这是“ 全部与工具有关 ”周期 的第一篇文章 。 所以, 很久以前…我已经找到了 合并冲突经常给我们带来很多乐趣。 通常,您的SourceTree报告如下所示: 在这种快乐的情况下,您可以合并pbxproj。 在我的整个职业生涯中使用不同的合并工具,最终得到了http://www.barebones.com/products/TextWrangler/-友好而性能卓越的文本编辑器。 但是,主要问题是验证。 Kin可以理想地满足对手动合并结果进行验证的要求。 我的合并结果最近: 到目前为止,我做了什么? 根据我的直觉,刚刚解决了四个冲突。 重新开始合并可能是浪费时间的选择,但是我确实有亲戚。 su-macbook-2e23:some_dir petr $ cd path_to_project / su-macbook-2e23:path_to_project petr $ kin ANTLR运行时和生成的代码版本不一致:4.6!= 4.5.2 ANTLR运行时和生成的代码版本不一致:4.6!= 4.5.2 错误:第4078:207行的输入’wrapsLines’不匹配,期望为’}’ 错误:行13742:4输入’LastTestingUpgradeCheck’不匹配,期望’LastUpgradeCheck’ 错误:第13743:4行的输入’LastUpgradeCheck’不匹配,期望为’}’ 太完美了吧? 我可以在4078和13743行上手动找到错误吗? 我相信不会 使用pip-Python软件包管理器,安装很简单。 用法很简单: 导航到项目目录 输入“ kin” 解决冲突,建立成功的时间有一些🍻

AltConf 2016:Udacity炉边聊天—#5 Mike Lee

欢迎来到我们的AltConf 2016 Fireside聊天系列中的第三篇! 对于今天的演讲,我们不得不与Mike Lee在一起。 Mike是一位精通旅行和经验丰富的iOS工程师,目前住在阿姆斯特丹,他专注于建立技术社区。 在登陆荷兰之前,Mike帮助开发了Tap Tap Go之类的应用程序以及Barack Obama的2008年总统竞选活动的iPhone应用程序。 不用说,我们很高兴有机会与他坐下! 我们谈论什么 如上所述,Mike确实专注于社区建设,我们花了很多时间谈论加入社区的重要性,以及这如何帮助您成长为开发人员。 我们还特别谈到了他在阿姆斯特丹为将新社区带入技术运动所做的努力,以及伟大的技术如何在世界各地发生,而不仅仅是在硅谷。 “伟大的技术无处不在,不仅在硅谷!” 我们的对话中最有趣的事情之一是元工程的想法,或者迈克所说的“工程工程师”。请确保观看整个聊天以了解这一内容! 外卖 科技是全球性的,新的社区如雨后春笋般出现,并在世界各地产生联系,通过以下方式,a)您加入和参与这些社区的程度将大大提高您作为开发商的成长,并且b)您可以帮助创建一个新的社区,无论您在世界上什么地方。 Mike Lee是一个很好的例子,我们鼓励您观看与Mike的谈话,因为我们知道您会从中受益匪浅! 网络上的Mike Lee https://twitter.com/bmf http://appsterdam.rs(Appsterdam) http://le.mu.rs(网站) 请继续关注Jaim Zuber主持的第6场《 Fireside Chat》! ( iPhreaks,有人吗?) 对iOS开发感兴趣? 无论您是编程新手还是准备进阶学习,我们都为您准备了程序。 今天就报名! iOS开发人员纳米学位计划 开始进行iOS App开发纳米学位计划

更好的iOS项目:如何使用rbenv管理iOS项目的ruby环境

在“更好的iOS项目”系列中,我们介绍了各种工具和环境,这些工具和环境对于更方便,高效地处理iOS项目很有用。 特别提示 对于随后的任何安装,您都不必通过sudo使用root用户权限。 如果您似乎需要,则很可能您之前已经有权限问题,或者您没有正确安装和设置rbenv 。 如何使用rbenv管理iOS项目的ruby环境 我们为什么要这样做? ruby已用于编程和运行各种iOS开发工具,例如fastlane , cocoapods或xcodeproj 。 macOS预先默认安装了较旧版本的ruby 。 由于系统本身使用ruby ,因此最佳实践是不要弄乱系统ruby,而要使用用户安装(以及最新)的ruby语言版本。 使用ruby版本管理器,您可以同时维护多个不同ruby版本的安装,并根据项目(自动通过.ruby-version文件)确定要使用哪个ruby版本。 本文末尾提供了本文中使用的工具和文件名的词汇表。 我应该使用哪个红宝石环境管理器? 我们在使用rbenv方面有一个流畅的经验,但是使用rvm或chruby应该可以得到类似的结果。 安装和设置rbenv 安装酿造 可以使用brew package manager轻松安装rbenv ,因此请确保已安装并运行它。 使用brew安装rbenv和ruby-build 通过运行安装rbenv (用于管理ruby环境) brew install rbenv 这还将安装ruby-build工具(用于通过rbenv安装ruby的版本)。 如果要升级,请运行 brew upgrade rbenv ruby-build 为您的外壳设置rbenv 安装完上述工具后,您需要在外壳程序的配置脚本中添加一个设置rbenv的调用。 您可以通过调用来找出正在使用的shell echo $0 根据结果​​,您需要更改〜/ .bash_profile (对于bash), 〜/ .zshrc (对于zsh)或外壳程序的相应文件(如果您有其他外壳程序)。 如果文件(例如〜/ .bash_profile )以前不存在,则只需创建它即可。 由于我们使用非常好的Oh-My-ZSH作为外壳,因此可以通过在图形文本编辑器中打开〜/ .zshrc来对其进行编辑,也可以通过在外壳中直接调用来对其进行编辑 nano ~/.zshrc […]

SWIFT:代码块可轻松访问iOS相机,照片库,视频,文件

照片,视频,文档对布告栏用户至关重要-这是他们交流和分享工作场所中日常活动的方式。 在为该应用的iOS版本开发此功能时,我意识到没有单个代码块可以从设备访问媒体文件。 这就是这件作品的来源。 如果您只需要一段代码即可完成此操作,请随时将其插入您的应用程序。 以下是创建自定义类的分步教程, 该类将帮助开发人员使用swift 4访问基本附件,例如“相机图像”,“照片库”,“视频”和“文件导入”。 TL:DR —您可以在此处查看其完整的GIST文件。 我已将其命名为AttachmentHandler.swift 步骤1:使用UIAlertController创建操作表 通过使用UIAlertController创建操作表。 我将在操作表中列出所有四个选项,并在底部列出“取消”按钮。 如果您想进一步了解UIAlertController。 请您在这里检查。 您也可以查找UIActionSheet,但这已被描述。 func showAttachmentActionSheet(vc:UIViewController){ currentVC = vc 让actionSheet = UIAlertController(标题:Constants.actionFileTypeHeading,消息:Constants.actionFileTypeDescription,preferredStyle:.actionSheet) actionSheet.addAction(UIAlertAction(title:Constants.camera,style:.default,handler:{(action)-> Void in self.authorisationStatus(attachmentTypeEnum:.camera,vc:self.currentVC!) })) actionSheet.addAction(UIAlertAction(title:Constants.phoneLibrary,style:.default,handler:{(action)-> Void in self.authorisationStatus(attachmentTypeEnum:.photoLibrary,vc:self.currentVC!) })) actionSheet.addAction(UIAlertAction(title:Constants.video,style:.default,handler:{(action)-> Void in self.authorisationStatus(attachmentTypeEnum:.video,vc:self.currentVC!) })) actionSheet.addAction(UIAlertAction(title:Constants.file,style:.default,handler:{(action)-> Void in self.documentPicker() })) actionSheet.addAction(UIAlertAction(title:Constants.cancelBtnTitle,style:.cancel,handler:nil)) vc.present(actionSheet,动画:true,完成:无) } 步骤2:检查授权状态 .. 来自PHPhotoLibrary 。 这意味着我们必须验证用户是否已获得访问其照片的权限。 在Info.plist中添加两行 隐私权-相机使用说明 隐私权—照片库使用说明 […]