iOS 开发

iOS 常用 XCode, Swift3, UITableView, cocatouch, 一起创建 iPhone, iPad 和 Macbook应用

Atlas,移动开发周期的统一方法:网络层

作为开发人员,我们通常花费大量时间来编写,重写和重构现有代码。 对于我们中的某些人来说,它代表了通过干净代码的乌托邦进行的漫长的迭代过程。 许多开发人员没有抓住软件工程的要点之一:避免通过推广可重用代码来重新发明轮子。 向没有直接参与开发的项目经理或其他团队解释此过程可能经常引起争论: 时间就是金钱,您知道吗? 另一方面,知识的增长是公司的关键部分 。 至于日常生活中的许多其他内容,则是在这两部分中间的某个时刻。 什么是地图集 当今的大多数软件都与后端服务器对话,下载一些数据,然后将其他数据发送回给用户。 虽然网络层只是一部分,但它在每个应用程序中都起着关键作用:因此自然而然地,它是我们开始使用Atlas进行标准化的第一个应用程序。 Atlas的目标是为IQUII上的每个新客户提供一个共同的基础(框架):它将包括从网络层到持久性支持,推送通知和许多其他部分的所有共同功能。 这样的项目背后的好处很多: 专注于真正重要的事情 :有了共同的成长基础,我们可以将重点放在项目的核心:UX,UI和功能。 稳定性 :只需维护一个代码库,我们就可以着眼于更坚实和经过良好测试的代码。 标准化开发周期 :这只是整个过程的一部分,但是有了一套通用的规则,我们可以更快,更紧密地开发:从一个项目切换到另一个项目更简单,更省力。 我们将其称为Atlas,因为Titan谴责永恒的天空:我们的框架将在IQUII及其iOS和Android平台上容纳整个移动生态系统。 在本文中,我们将介绍Atlas的关键部分之一:网络层。 建立网络层的“不要”部分 如果您从未创建过单例课程来举行网络通话,请举手。 这是我在过去几年中遇到很多时间的常见情况,实际上,这是创建网络类的最简单方法:应用程序的每个网络调用都存在的单个单例类。 不要误会我的意思; 单身并不是邪恶,但是这种方法自愿打破了单身责任原则。 不管我们认为什么是出色的代码,它始终需要一种简单的质量: 代码必须是可维护的 。 任何无法维护且不能相对轻松地适应不断变化的需求的代码,都是在等待变得难以管理,然后过时的代码。 在任何编写不佳的代码中,您总是可以找到一个承担多个责任的类 我们的单身人士了解有关连接的所有信息( 基本url,每个请求的路径 ),如何构建和执行每个请求,如何解析响应数据,最后还管理内部用户会话和某些用户的配置文件数据(噩梦!)。 与网络连接相关的所有内容都位于这个庞大的单例类中。 如果您需要进行依赖注入,这也很成问题,此外,出于测试目的,也不能轻易对其进行嘲笑。 正确的方式 Atlas的目标之一是充当我们称为Athena的后端服务的通用客户端框架。 Athena是使用NodeJS / MongoDB创建的现代后端应用程序,它公开了REST JSON服务。 像Atlas一样,Athena代表了IQUII上每个新项目的共同点:它提供了一组通用的结构和方法,可以针对特定项目进行扩展。 从这个角度来看,我们在网络层要实现的功能最少: 用户持久性 :允许主机应用轻松登录/注销到系统中,同时保持会话活动(以及用户配置文件和设置)。 会话管理必须对主机应用程序透明,而配置文件和设置应由框架本身自动更新。 网络操作的抽象层 :提供一个可扩展的点来扩展网络功能:从编写新的端点来管理超时,处理网络错误,连接不良以及将对象转换为请求(反之亦然)Atlas提供了一种标准且健壮的方法与后端通信。 Handle Server Autentication :在Athena中,凭据由JWT的访问/刷新令牌管理。 基本上,这意味着用户登录后,您的应用会收到两个令牌:访问令牌是一个短暂的代码,必须在每次后续调用中都发送给后端; 刷新令牌是安全保存在应用程序沙箱中的长期令牌,仅用于在新访问令牌请求过期后对其进行身份验证(如果您对此官方OAuth指南感兴趣,请说明此握手的详细信息)。 […]

最聪明的购物钱包FuturePay

业务问题 我们大多数人都有大钱包。 平均而言,我们每个人都有两张信用卡和借记卡,一张驾驶执照,几张会员卡或奖励卡。 我们还有一点现金和几张收据。 无论我们将笨重的钱包放在后兜还是皮包中,我们都梦想着能够拿起手机和钥匙,并拥有当天所需的一切。 Future Group正在提供一种解决方案,通过将所有卡整合到他们的手机中,使用户更进一步地实现这一愿望。 未来集团(Future Group)是印度最大的多元化连锁零售先驱之一,汇集了来自印度企业,买卖双方的各种热情社区。 拥有大量的零售连锁店和广泛的用户基础,Future Group希望提供一个易于使用的绝对安全的数字钱包,以便在Future Group的各家商店购物。 订婚 在Copper Mobile,一支组织良好的团队拥有丰富的经验和先进的基础架构,开发了FuturePay iOS应用程序。 考虑到移动数字钱包的脆弱性,开发人员在产品上进行了不懈的努力。 当使用智能手机进行无线支付交易时,人们正在处理必须以无缝但安全的方式一起工作的多种技术,Copper Mobile花了一些时间研究出于安全原因而要使用的加密技术,以确保用户数据是100%安全的。 该应用程序的一些突出功能包括即时OTP,可让用户进行交易 即使在没有网络的区域中,“地理位置”也可以帮助用户寻找附近的商店,将其重定向到Google或Apple Maps进行导航,通过虚拟收据跟踪交易和余额,最后与本地或在线竞争对手进行购物比较。 价格匹配是Future Pay应用程序中的一项独有功能,可确保用户在使用Future Group购物时始终能获得最优惠的价格。 价格匹配将价格与本地或在线竞争对手的广告价格进行比较。 如果发现Future Group价格更高,他们会将差额退还给用户Future Pay钱包。 结果 Copper Mobile与客户团队紧密合作,共同构建数字钱包FuturePay。 这是一个封闭的eWallet应用程序,仅适用于与Future Group相关和/或在Future Group下的商店。 在整个参与过程中,两个团队在战略阶段到开发,启动和支持阶段之间都互相支持。 Copper Mobile确保毫不费力地启动了该移动应用程序。 该应用程序很快就下载了2次lac,并且在Apple App Store中排名前10位。

RxSwit —使用“发布主题”传递数据

有很多人描述了响应式编程的不同定义。 但是根据我的研究和分析,我为此找到了捷径。 “ RxSwift是异步编程的新范例。, 我在RxSwift上工作了一年,所以对它的好处有所了解。 我能够隐约地回答这些问题。 我虽然不简洁。 第一件事是在ViewController.swift文件中使用默认文本和DisposeBag变量创建UILabel的Outlet。 DisposeBag是RxSwift的内存管理机制。 现在,我们编写用于订阅的代码,该代码观察EditViewController文本和颜色的PublishSubject的值。 PublishSubject是主题的一种。 我们可以说PublishSubject既是Observer也是输入。 但是根据不同的主题属性,PublishSubject会忽略订阅之前发出的所有元素。 我们在ViewController中有一个名为Let’s Edit的Button,可将其重定向到EditViewController以选择文本和颜色。 下面是按钮的代码。 订阅观察者: 在上面的代码中,当单击红色,绿色或蓝色按钮时,我们观察到EditViewController发出的文本和颜色主题。 这可以使用subscription(onNext,onError,onCompleted)方法完成。 订阅方法将通过处置(by 🙂方法处置 。 onNext()将在下面的代码中发出该值,该值将由ViewController简单地订阅。 声明发布主题: 在这里,我们创建一个文本字段出口。 同时声明文本和颜色观察者。 文本观察器是String类型,它传递文本字段的值,颜色观察器传递颜色对象,方法是单击颜色按钮(红色,蓝色和绿色)。 通过观察者发射元素: 当用户在文本字段上输入一些文本并触摸下面的颜色按钮之一时,即会发生 textObserver发出文本值。 根据颜色按钮标签,它将使用colorObserver传递颜色值 最后,它将弹出到ViewController,因此可以显示更改。 演示程序的输出如下。 您可以检查它的简单程度,也可以尝试使用代码。 享受代码…

Gotta Go Fast:在iOS中构建速度。 第2部分

有时,您会发现自己的应用无法正常运行。 因此,这里提供了一些您可以使用的工具以及可以使事情变得更好的最佳实践。 这是本文的第二部分,基于2017年国际移动开发者大会MBLT DEV的Fyusion的iOS工程师,RayWenderlich.com上的iOS开发教程作者Luke Parham的主题演讲。 在这里您可以找到第一部分。 在这里观看完整的演讲: 这是一个时间分析器,其顶部有一个帧速率表。 底部是调试选项中最重要的部分。 我们将介绍两个最重要和最容易解决的问题。 第一个是颜色混合层。 这是一个非常容易解决的问题。 这使我们进入了表演警察的第一部分。 基本上,许多应用程序都存在问题:甚至iMessage(心爱的Apple应用程序)也做了很多不太出色的事情。 在这里,我们看到有很多红色: 红色表示您的标签带有白色背景。 然后,它们位于另一个白色背景之上,并且由于某种原因,它们未设置为不透明。 因此,搅拌器将这些颜色(白色和白色)混合在一起,从而得到白色。 对于具有红色的每个像素,它都会进行额外的计算而没有任何好处,但是背景仍然会变为白色。 为避免这种情况,只要它们在同一颜色上具有相同的颜色,就可以使它们尽可能不透明。 如果子视图具有相同的背景色,则不需要混合。 您所要做的就是将图层的不透明度设置为1,然后确保设置了背景色。 如果您的背景颜色是透明的,则它永远不会是不透明的。 如果打开此选项,则屏幕外渲染的元素将以黄色显示。 关于Core Animation工具的好处是您可以看到其他应用程序。 您可以打开这些选项,然后转到系统中的任何应用程序,然后可以查看它们在做什么错。 在这种情况下,Instagram顶部会显示这些小气泡,向您展示人们的故事。 如您所见,它们都是黄色的。 在iPhone 5上,它们的速度非常慢。 这是因为屏幕外渲染比alpha混合差得多。 它使GPU停顿。 最终必须在GPU和CPU之间来回进行额外的计算,因此您将获得大多数情况下不必要的额外停顿。 下一条规则:不要使用转角半径属性。 如果您有一个视图并设置了view.layer.сornerRadius,则始终会引入屏幕外渲染。 相反,您可以使用贝塞尔曲线路径和早期的同类CGBitmap内容。 在这种情况下,为UIGraphics上下文。 此函数与UIImage一起使用,它具有一定的大小,并根据该大小进行圆角处理,并使用贝塞尔曲线路径进行剪切。 然后,我们裁剪图像并从UIImage上下文返回它。 因此,这将返回一个预先舍入的图像,而不是舍入该图像所在的视图。 最后一个例子。 这是Twitter,这是此动画运行的实时视图。 它应该打开并向您显示信息,但是所有这些文本和内容均已在屏幕外呈现,因此将动画放慢了速度。 这是我在App Store上的应用程序中发现的性能最低的东西。 那么这是怎么发生的呢? 导致这种情况发生的一件事是CALayer的shouldRasterize属性。 这是图层上的一个选项,允许您缓存已渲染的纹理。 有很多奇怪的规则。 就像如果未在一定毫秒内使用它一样,它将离开缓存。 然后,如果它离开缓存,它将在每帧上进行屏幕外渲染。 拥有它可能带来的好处并不真正值得。 而且很难检查它是否真的使您受益。 如果可以,请避免屏幕外渲染和Alpha混合。 […]

辛格尔顿很好-病理骗子

珍妮·洛里奥兹(Jeanne Lorioz)的艺术 在谈论软件架构时,没有灵丹妙药。 但是,为了编写可测试的,松耦合的和干净的代码,每个系统都应遵循一些原则。 我们以编写可测试的,松散耦合的和干净的代码来谈论Singleton。 我们喜欢辛格尔顿 我们之所以喜欢辛格尔顿,仅仅是因为 免费到处获取 使您的API非常简单,“无依赖性” 免费到处获取 该代码段看起来非常相似: //fetch user information let profile = UserCenter.sharedInstance.getProfile() let userId = UserCenter.sharedInstance.user.id //update user profile UserCenter.sharedInstance.update(profile) 您可以免费获取新变量,而无需通过接口传递它。 出色,这意味着接口保持不变 使您的API看起来非常简单 class UserProfileViewController{ init() { let profile = UserCenter.user.getProfile() … } } //How to initialize UserProfileViewController let controller = UserProfileViewController() navigator.pushViewController(controller) 创建UserProfileViewController的实例非常容易,似乎在初始化它时不需要任何上下文。 您的同事将感谢您挽救生命。 但是单身人士并不总是对您有好处,角度还是邪恶取决于您。 许多博客向我们展示了为什么单例很糟糕,以及如何使所有单例都消失了。 但是与此同时,Apple和第三方Swift开发人员都继续在应用程序内部和共享框架中内部使用它们。 在继续之前,我应该强调这是我的单例观点,因此,如果我搞砸了是我的错。 […]

iOS开发课程:调度

如何并发执行代码? 如何管理调度工作单位? 让我们在快速指南中使用Dispatch框架创建一个简单的项目! 调度包括语言功能,运行时库和系统增强功能,这些系统功能全面,全面地改进了对macOS,iOS,watchOS和tvOS中多核硬件上的并发代码执行的支持。 BSD子系统,Core Foundation和Cocoa API均已扩展为使用这些增强功能,以帮助系统和您的应用程序更快,更高效地运行,并提高响应速度。 考虑单个应用程序有效地使用多个内核有多么困难,更不用说在具有不同数量计算内核的不同计算机上或在多个应用程序竞争那些内核的环境中进行操作了。 在系统级别运行的GCD可以更好地满足所有正在运行的应用程序的需求,并以平衡的方式将它们与可用的系统资源进行匹配。 阅读有关Apple Developer的更多信息 每个工作项都可以同步或异步执行。 当工作项与sync方法同步执行时,程序将等到执行完成后再返回方法调用。 当使用async方法异步执行工作项时,该方法调用立即返回。 通过同步 / 异步执行在操场上运行以下代码 分派队列可以是串行的 ,以便一次执行一个工作项,也可以是并发的 ,以使工作项按顺序出队,但可以一次全部运行并且可以按任何顺序完成。 串行队列和并发队列均以先进先出(FIFO)顺序处理工作项。 在操场上修改代码,然后再次运行。 现在我们有一个并发队列。 *默认为串行 启动应用程序时,系统会自动创建一个称为main queue的特殊队列 。 排队到主队列中的工作项在应用程序的主线程上顺序执行。 您可以使用main type属性访问主队列。 重要 尝试在主队列上同步执行工作项会导致死锁。 在操场上运行代码。 那演示了如何从background在主队列上执行代码。 除了串行主队列之外,系统还创建了许多全局并发调度队列。 您可以使用global(attributes :)类型方法访问与指定服务质量(QoS)最匹配的全局并发队列。 该代码演示了使用不同qos模式的队列初始化。 工作项使您可以直接配置各个工作单元的属性。 它们还使您可以为各个工作单元着想,以等待其完成,收到有关其完成的通知和/或取消它们的目的。 DispatchWorkItem封装了可以执行的工作。 可以将工作项分派到DispatchQueue和DispatchGroup 。 也可以将DispatchSource设置为DispatchSource事件,注册或取消处理程序。 使用WorkItem管理演示程序在操场上运行代码。 分组块允许聚合同步。 您的应用程序可以提交多个块并跟踪它们何时完成,即使它们可能在不同的队列上运行也是如此。 如果在完成所有指定任务之前无法取得进展,此行为将很有帮助。 DispatchGroup允许工作的聚合同步。 您可以使用它们来提交多个不同的工作项,并跟踪它们的完成时间,即使它们可能在不同的队列中运行。 如果在完成所有指定任务之前无法取得进展,此行为将很有帮助。 你完成了! 拍! 拍! 接下来是什么? […]