Tag: 移动

自动化的移动发行

在Compass,移动团队高度依赖自动化。 我们使用的工具包括: CircleCI 持续集成和交付 对CircleCI的现代持续集成和交付平台充满信心地快速发布代码。 提供于… circleci.com 我们喜欢CircleCI,因为它可以正常工作。 仅需3行即可使其正常工作 快车道 fastlane –用于持续交付的iOS和Android自动化 fastlane是发布您的iOS和Android应用程序的工具🚀它可以处理所有繁琐的任务,例如生成屏幕截图… fastlane.tools 我们喜欢fastlane,因为它可以让我们快速编写自动化脚本来编写新的appstore / testflight / hockey 曲棍球SDK HockeyApp –您的应用程序的平台 HockeyApp是收集实时崩溃报告,从用户那里获得反馈,分发测试版以及……的最佳方法。www.hockeyapp.net 我们喜欢曲棍球,因为它很容易上手:

Swift中的新手课程

在上一篇文章中,我谈到了结构,因此我只认为对Classs进行跟进是正确的。 将Classes制造商用来生产产品的模具。 您可以基于一个模具来创建许多产品。 使用一个模具( class ),您可以基于每个模具具有的形状,大小等属性( properties )来创建多个产品( objects )。 让我们看一下代码 打开操场跟进。 这是class的基本语法。 如果您熟悉结构,您会注意到类似的类语法。 假设我们有一个简单的Person class示例。 在该类中,我们将具有name和age的properties ,然后将其赋予一个initializer 。 initializer是我们每次尝试创建Person object时都会运行的方法。 在初始化程序中,我们传递组成Person的参数。 我们简单地创建一个名为person1的变量,该变量等于Person class ,当添加括号时,它将询问我们在初始化器中声明的参数。 现在我们可以使用person1对象并获取其属性。 类中的功能 我们还可以在类中使用函数,这将使我们的人员对象具有调用能力。 使用getName()我们返回一个String说“您的名字是_____” 我们可以通过person1对象访问函数。 类是引用类型 类是引用类型,而结构是值类型。 我将演示引用类型如何工作。 如果您想了解结构和值类型,请转到我的前一篇文章。 如果要创建一个新对象, person2如下所示: 然后创建一个变量person3 等于 person2 : 然后我们更改person3的属性,让我们看看它将如何更改person2。 让我们给person3 55岁 。 现在,让我们同时阅读person2和person3的年龄。 您可以看到两个年龄都相同。 为什么? 这是因为person3本质上是person2。 当我们存储一个类时,我们会将这些信息存储在内存中,并且person2持有对该数据所在位置的引用。 当使person3等于person2时,我们只需查看该数据的相同参考位置。 Person3不是person2的副本。 是人2。 希望有道理。 包起来 这是有关类的非常准系统的文章,我计划在另一篇文章中也涉及类的继承。 […]

Swift中的反应式编程可提供更具可读性的代码

响应式编程是定义响应异步事件的应用程序行为的有用工具。 它将异步操作处理代码从iOS中常见的委托模式转移到更具声明性的形式,使异步性更易于推理。 我没有使用响应式框架从头开始构建应用程序的经验,但是随着我逐渐增加对所涉及概念的理解,我发现在很多情况下,大量的响应式编程已使工作变得更加整洁。更具可读性的代码。 我一直在使用的框架是RxSwift,它是ReactiveX API的Swift实现,但是还有其他可用选项。 在本文中,我们将简要地探讨一个示例,该示例演示如何使用RxSwift创建一个可观察的序列来替换原本会分散在多个不同回调中的代码。 对于我们的示例,要求如下所示,我们必须显示一个垂直滚动的项目列表,每个项目都有一个要显示的图像,该图像必须通过网络异步加载。 我们不能简单地同时从网络中获取所有图像,因为我们的列表可能很长,并且用户甚至可能没有浏览到最后,因此最终可能会因不必要的网络调用而浪费能量和数据。 另一个限制是,当设备连接到wifi时,我们希望浏览的行为不同于连接到蜂窝网络时的行为。 当连接到wifi时,我们希望在用户滚动之前加载图像,以便在屏幕上滚动显示单元时就可以显示图像了。 当连接到蜂窝网络时,我们只希望在用户停止滚动时加载图像,以防止在滚动列表时使用过多的数据。 为了实现此行为,我们需要遵循几种协议,它们是UITableViewDelegate , UITableViewDataSourcePrefetching和UIScrollViewDelegate 。 下面的代码给出了在视图控制器中外观的想法。 考虑到我们需求的复杂性,这并不是一个不好的结果,尽管它确实使我们一眼就很难看出图像加载行为是如何工作的,而且如果这些回调分散在一个大文件中(或几个文件)。 另一个复杂的因素是,这些委托回调通常还需要执行其他功能,这在阅读和理解图像获取行为时会产生更大的背景噪音。 反应式编程如何提供帮助? 我们可以使用反应式编程来定义可观察的事件流,这些事件驱动我们的loadImagesIfNecessary(for:)函数。 每当我们要加载一组图像时,此可观察对象将发出一个由索引路径数组组成的事件。 我们将通过组合和转换与我们感兴趣的委托回调相对应的可观察变量来构造此可观察变量(这些可观察变量在RxSwift的子组件RxCocoa中实现)。 以下是我们如何设置和使用此事件序列的示例。 从功能上讲,这应该与我们最初探讨的传统委托回调实现相同,但是,我认为它使我们的代码更易于理解,因为我们现在可以在一处读取所有图像提取逻辑,而背景噪音却更少。 这是我发现应用简单的反应式编程模式以便组合在一起并简化代码中的复杂逻辑的一种方法。 它确实要求读者对反应式编程原理有基本的了解,并向代码引入了第三方依赖性(反应式编程框架,在此示例中为RxSwift)。 您如何看待这种方法? 以这种方式进行逻辑合并值得额外的开销吗? 如果您有任何建议或问题,请给我@RowbotNZ发消息!

减少和过滤

“ Aujourd’hui nous allons illustreràtravers plusieurs L’utilitéde reduce and filter, fond d’ordresupérieurpour manipuler les collection”。 过滤 国务卿,布克尔·波克勒和卢旺达·雷蒙·弗朗西斯科·德·雷蒙·弗朗西斯·科普尔等人收藏,并附有条件性唯一性证书。 Voici签名: 原始封包和封包封的功能以及原封不动的清单。 禁止单身或单身的人在每次旅行中享有永久的权利。 对偶的支持者,对传统的声音的支持: Voici维护人员按功能选择过滤功能 : 商业评论书,以及精美的纪念章和纪念章过滤器,以及不动产说明书。 降低 塞隆语和确定性歌曲的用法和样例:乘数,索性等…独特的价值和价值。 Voici签名: 入门级和高级级的参数功能。 最有价值的初次使用权参数和最终使用权的参数将被优先考虑以保证其最终产量和价值。 法国传统音乐的支持者: Voici维护人员lemême示例avec la fonction reduce : 可以有效地减少不必要的损失,并可以轻松地解决价值问题,并可以有效地降低成本。 结论 遵循性原则可对各种功能进行过滤并 减少代码的永久性添加,并具有持久性和持久性。 N’hésitezpasàlaisser un commentaire si des ou des remarques。

为什么要抽象任何iOS第三方库

如果您有iOS应用,则可能已集成了外部库和工具来帮助您更快地准备好产品。 但是,您的iOS体系结构和快速代码不应依赖于这些库。 与许多iOS开发人员一样,您已经为应用程序实现了外部服务。 它可能是诸如Stripe之类的支付系统,诸如NewRelic或Crashlytics之类的监控工具,也可能是诸如Google Analytics(分析)之类的跟踪平台。 这些工具很棒,但是,现在您必须切换到新服务。 这是否意味着您有数小时来重构方法? 您是否需要重写数百行代码? 如果是,那么这就是我们应该始终为外部服务抽象您的实现的原因。 在此演示中,我将展示如何通过Firebase集成将其切换到Fabric来记录事件。 这种方法包括如何抽象化实现以将第三方库包含到我们的代码中,并使其更易于迁移。 为了准备用于迁移的代码,我们需要抽象一些元素:要发送的事件,记录器,以及可能还需要经理来使所有内容保持单一状态。 假设我们有3个经典事件,分别登陆首页,注册和登录。我的视图可能如下所示 import UIKit import Firebase import UIKit import Firebase class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } override […]

DevScoop:十大iOS开发链接| 2018年3月5日

九十九个Swift问题 :九十九个Swift问题是一组有趣的问题,它们将帮助像您一样的Swift程序员学习和练习Swift编程语言中的逻辑编程,数据结构和算法方面的技能。 Swift键路径如何让我们编写更自然的代码 :键路径旨在允许您在不实际调用属性的情况下引用属性-您拥有对属性本身的引用,而不是读取其值。 它们在Swift中的使用仍在不断发展,并且在许多方面,它们都受到Objective-C中关键路径支持的影响,但是已经出现了一些清晰的设计模式。 如何在Swift中应用单一职责原则 :有时候,当我们学习如何编码时,很难理解类职责概念。 这是因为我们的第一个项目变得难以维护,原因是我们的代码中按类包含许多行,更重要的是,它承担了许多责任。 NSTimer的秘密世界:NSTimer的技巧和窍门,以及如何使用GCD创建可靠的替代方法。 创建您的私有CocoaPod库 : CocoaPods是管理Xcode项目周围依赖性的最常用工具。 让我们看看如何创建自己的私人吊舱。 REST-aurant上的GraphQL : GraphQL的美味介绍。 iOS开发中Ruby的历史 : Ruby通过创建CocoaPods,Fastlane等工具解决了Apple开发人员工具的复杂问题。 大多数iOS开发人员已经在他们自己的工作流程中接受了Ruby,因此Ruby不会很快退出iOS应用程序开发。 根据Alto’s Odyssey的创建者的说法,iOS游戏的发展状况 : 2015年的Alto’s Adventure出人意料。 它作为无微交易的高级游戏在iOS上发布,并在全球App Store排行榜上名列前茅。 它是由Alto团队开发的,该团队是加拿大一家名为Snowman的公司与艺术家Harry Nesbitt的合作,后者此前尚未发布过游戏。 Slack和GitHub:您的终极生产力对 : GitHub和Slack一起是您的终极生产力对,在团队对话的同时,还提供了对开发工作的更大可见性。 从Terminal.md打开Xcode工作区 :这是从终端打开Xcode项目的快捷方式。 FlippingNotch : FlippingNotch是“拉动刷新/添加/显示”自定义动画,它是使用iPhone X Notch编写的Swift。 如何知道何时应该辞职:考虑辞职? 如果是这样,您并不孤单。 美国每个月有超过200万人辞职。 容易发生的事情不会持久。 持续什么,都不容易。 如果您不想错过任何内容,请注册我的新闻通讯=> DevScoop

斯威夫特语言,布里飞解释

Swift是一种用于开发iOS,WatchOS,tvOS和MacOS应用程序的编程语言。 苹果公司宣布了WWDC 2014。 Swift设计为与Objective C语言一起使用。 我将尝试通过一些示例来简短地解释语言(并非涵盖所有要点)。 “ var”关键字清除变量; 例如:var doubleNumber:Double = 1.0 “ let”关键字清除常量; 例如:let constantDoubleNumber:Double = 1.0 在快速语言中,无需始终指定变量的类型。 通过将值分配给变量或常量,编译器可以指定变量的类型。 例如:let intNumber = 50(类型为整数),let doubleNumber = 50.0(类型为double) 要在字符串中使用不同的变量,我们可以使用反斜杠(“ \”)和括号(“()”) 例如:let numberOne = 4,let numberTwo = 5 让stringOne =“我呆在\(numberOne)楼” 让stringTwo =“我有\(numberTwo)寿” 用于数组的循环; 例如:letterAge = [8,13,11,41,38,55,78] 年龄的人{ 如果年龄<25 { println(“青少年时代”) } 否则,如果25 <年龄<60 { println(“ Mautre age”) […]

UITableView和UICollectionView中的平滑滚动

正如大多数iOS开发人员所知,显示数据集是构建移动应用程序中的一项相当常见的任务。 Apple的SDK提供了两个组件来帮助执行这样的任务,而不必从头开始执行所有操作:表视图( UITableView )和集合视图( UICollectionView ) 。 表格视图和集合视图均旨在支持显示可滚动显示的数据集。 但是,当显示大量数据时,实现完美平滑的滚动可能非常棘手。 这不是理想的,因为它会对用户体验产生负面影响。 作为Capital One Mobile应用程序iOS开发团队的成员,我有机会对表格视图和集合视图进行了尝试。 这篇文章反映了我在显示大量可滚动数据方面的个人经验。 在其中,我们将介绍最重要的技巧,以优化上述SDK组件的性能。 此步骤对于获得非常流畅的滚动体验至关重要。 请注意,以下几点大多数都适用于UITableView和UICollectionView,因为它们共享大量的“ 幕后 ”行为。 关于UICollectionView的几点要点, 因为此视图将其他布局细节放在开发人员的肩膀上。 让我们从快速概述上述组件开始。 UITableView经过优化,可以将视图显示为一系列行。 由于布局是预定义的,因此SDK组件会处理大部分布局,并提供主要专注于显示单元内容的委托。 另一方面, UICollectionView提供了最大的灵活性,因为布局是完全可定制的。 但是,集合视图的灵活性是以必须注意有关如何执行布局的其他细节为代价的。 UITableView和UICollectionView的 共同技巧 注意: 我将对 代码段 使用 UITableView 。 但是相同的概念也适用于 UICollectionView 。 单元格渲染是一项关键任务 UITableView和UITableViewCell之间的主要交互可以通过以下事件来描述: 表格视图正在请求需要显示的单元格(tableView(_:cellForRowAt :))。 表格视图即将显示单元格(tableView(_:willDisplay:forRowAt :))。 该单元格已从表视图(tableView(_:didEndDisplaying:forRowAt :))中删除。 对于上述所有事件,表视图都将传递与其进行交互的索引(行)。 这是UITableViewCell生命周期的可视化: 首先,tableView(_:cellForRowAt :)方法应尽可能快。 每次需要显示单元格时都会调用此方法。 它执行得越快,表格视图的滚动就越平滑。 为了确保我们尽可能快地渲染单元,我们可以做一些事情。 以下是来自Apple文档的呈现单元格的基本代码: 在获取了将要重用的单元实例之后(dequeueReusableCell(withIdentifier:for […]

真实示例:使用NSURLSession提取JSON并填充UITableView第2部分。

这是这篇文章的第1部分。 在第1部分中,我们使用NSURLSession从Web上获取了JSON并将其存储到本地数组tableArray中 。 让我们开始打开Main.storyboard 。 继续并删除默认的ViewController 。 现在,您应该有一个空白的Main.storyboard 。 在右侧平面上,从对象库中拖放UITableViewController 。 在将UITableViewController连接到代码之前,我们需要使ViewController.swift与UITableViewController保持一致 。 为此,请打开ViewController.swift。 更改此: ViewController类:UIViewController 对此: ViewController类:UITableViewController 现在,通过打开main.Storyboard并单击控制器的外部,将UITableViewController连接到我们的代码。 打开Identity Inspector并将类更改为ViewController 。 现在我们需要确保它是Initial View Controller 。 现在让我们回到ViewController.swift中添加一些内容。 在viewDidLoad中添加以下两行代码: self.tableView.dataSource =自我 self.tableView.delegate =自我 为了保持干净整洁,让我们创建ViewController的扩展 。 把这个放在 类大括号外 。 现在,在“ 属性”检查器中 ,将“ 单元格”作为标识符 。 现在,我们要做的就是在parseJSON()函数中添加self.tableView.reload() 。 现在,您可以使用C ommand + R运行您的项目。 您在控制台中看到该阵列的时间可能要延迟到填充表格所需的时间,或者直到您单击屏幕后才会显示。 这是因为未在主线程上调用self.tableView.reload() 。 您应该始终在主线程上更新UI。 我们可以这样简单地包装重载: DispatchQueue.main.async { […]

Swift中的策略模式

最近,我在NSCoder Night Madrid上发表了有关战略模式的演讲。 人们喜欢它! 我认为我们的社区也将从这些知识中受益。 因此,在本指南中,我将解释iOS的策略模式并提供一些示例。 首先,我们应该定义这种模式。 在Wikipedia中,其定义如下: 在计算机编程中, 策略模式是一种行为软件设计模式 ,可以在运行时选择算法。 代码不是直接实现单个算法,而是接收运行时指令,以说明要使用的算法系列中的哪个。 definition⁉️这个定义非常理论化,所以我认为我们可以更轻松地定义它: 将算法封装在类中,使它们在运行时可重用和互换。 分类 设计模式根据其目标分为三类: 创造力的 结构性 行为的 是的,策略模式是一种行为模式,因为它与对象的行为有关。 容易吧? 在许多情况下,我们可以使用它。 让我们谈谈三个非常具体的场景,在这些场景中我们可以清楚地看到战略模式的价值。 1️⃣用不同的方法做同样的事情 当您需要以不同的方式在代码中执行相同的操作时,可以使用它是一个明显的示例。 2️⃣而不是继承 如果您需要扩展类的功能并执行此操作,则需要创建一个继承自该类的新类。 3️⃣if / else块的替代方法 这是我最喜欢的。 有时,如果您查看一个类,您会发现它的if / else或switch块太多,我是说条件块。 这表明该班级的职责比应有的多。 使用策略模式将有助于您分发它们。 假设我们需要创建一个Logger类,该类在控制台中打印一条消息。 此外,此类还允许您打印样式化的消息: 小写 , 大写和大写 。 因此,可能的实现可能是这样的: 内容: 定义我们要封装的动作的协议。 在我们的示例中,操作将是 记录一条消息 。 谁: 包含符合策略的对象的对象。 在我们的示例中, 使用策略记录消息 的对象可能是对象 。 方法: […]