Tag: 迅捷

让我们做一个应用程序

今天,我们将要构建一些东西……我们应该从哪里开始? 我想一个好的起点是开始。 到底在哪里? 这是我在这个项目开始时的第一个问题。 该博客将是一系列有关如何使您的想法永不放弃的应用程序创意的生动系列。 在我们一起经历这一旅程的过程中,我将尝试解释我的决定背后的原因以及我在此过程中面临的任何挑战。 有时我会包含代码,有时只是cat .gifs。 无论哪种方式,我都希望本系列对我的读者和我自己都有启发。 让我们开始? 新的应用似乎像是在空旷的地方盛开。 每天平均有8个新应用程序添加到应用程序商店,迄今为止,有超过200万个iOS应用程序。 在所有竞争中,当务之急是我们首先关注重要的部分,并添加功能以增强体验,一旦我们牢牢掌握了所需的基本功能。 如果您以前曾经历过这种操作,请举手:您正在洗澡,或者躺在床上等着入睡,这让您大吃一惊……这个主意。 您一直在等待的想法! 世界一直在等待的那个! 如果只有您的想法存在,世界将永远改变。 但是,在这个世界变得光彩夺目之前,您需要确保自己拥有获得保护的权利,以免您的绝妙主意落入错误的人手中。 幸运的是,不幸的是,世界并没有以这种方式运作。 来自商业背景,我可以告诉您第一手的想法,好的和坏的都是一角钱。 如果您有那个尤里卡的时刻,我可以保证有一百个人也有一个。 不相信我吗? 好吧,向您展示这是真的,我将提出自己的想法,我敢于您接受。 不完全是… 我是认真的… 请…? 该死的我希望你能,这可能使我不必写本博客的其余部分,而我可以专注于更重要的事情,例如洗衣服或赶上《权力的游戏》。 使一个想法变得出色的不是想法本身,而是它的实现,这就是我们今天要关注的重点。 下面列出了一些在决定是否坚持一个想法时要考虑的重要事项: 您的愿景独特吗? 可以轻松复制吗? 布局和设计是否功能实用且核心受众易于理解? 您的创意市场是否足够大,值得花大量时间? (对不起,巨魔塑像收藏家很久以前为您弹出了这个泡泡。) 这个想法是可编码的吗? 发明时间旅行不只是代码问题。 测试是确保最终用户拥有良好体验的重要组成部分。 用户的反馈-受众如何看待您的产品? 他们如何使用他们可能永远不会承认的东西? 提高性能-我们可以对其进行重建……更好,更快,更坚固。 更新— PC加载信? F是什么意思? 现在我们已经定义了一些要记住的事情,让我们继续进行。 我改变世界的想法: 星期五晚上7:30。 您在漫长的一周工作后回到家中,然后就坐在公寓里,完全忘记了有两天的时间间隔,称为周末,您忘记了要计划。 您不想坐在家里(毕竟这是纽约),但您不知道今晚到底发生了什么,更糟糕的是,您不想结束自己不想享受的事情。 嗯,我该如何解决我的问题。 聚会? 充满了维尔多斯。 喊叫? 我60岁? 火种? 我怎么了 […]

服务器API层설계(1/2)

iOS版(ViewController)版的것이다。 를를목표목표용해왔는데용해왔는데용해왔는데용해왔는데용해왔는데를를를를를를를를를를에에해봤해봤해봤해봤해봤해봤해봤해봤해봤 이제。여여여해해해해쉽게트트트트트트트만든만든다。 최종적인API인터페이스레이어는다이다 이제추가해나가면서사된다。 。다젝트에서로젝트에서사용다한면이여이여기저기있다。 하고재재용성을용성을하고하고하고2편으로이해봐야겠정리해봐야겠다。

Swift —访问控制

访问控制限制从其他源文件和模块中的代码访问部分代码。 使用此功能,您可以隐藏代码的实现细节,并指定可以访问和使用该代码的首选接口。 (快速文档) 您可以指定对单个类型以及属性,方法,初始化程序和下标的访问级别。 默认情况下,如果您不先指定访问级别,则Swift会分配内部访问级别。 快速访问级别 私人的 文件私有 内部 上市 打开 open/public启用实体可以在其定义模块的任何源文件中使用。 从上图可以看到, public访问权限授予对其他应用程序和框架的访问权限。 您可以从定义模块或导入该模块的任何模块中的任何源文件访问打开的类和类成员。 公共对子类化和覆盖的限制更大。 上面的代码显示了最少受限级别的访问。 当指定框架的公共接口时,通常是开放和公共访问。 internal访问使实体可以在其定义模块的ant源文件中使用。 它不允许访问该模块外部的任何源文件。 通常在定义应用程序或框架的内部结构时使用。 这是默认的访问级别。 file-private访问将实体的使用限制为自己定义的源文件。 当它在整个文件中使用时,用于隐藏一段代码的细节。 private访问将实体的使用限制为包含在声明中。 它用于隐藏仅在单个声明中使用的一段代码的详细信息。 请记住,应用程序目标是其自己的模块,默认情况下设置为内部访问。 Swift 4将私有访问的范围扩大到包括扩展名,但扩展名仍必须位于同一源文件中才能进行私有访问。

迦太基与可可足-建立时间分析用例

在开发iOS项目时,您可能会面临的最著名的难题之一就是您应该使用哪个程序包管理器:Cocoapods或Carthage。 当然,没有正确的答案。 两种方法都是可能的,并且它们都有消极点和积极点。 但是在这篇文章中,我想谈谈我在大力神开发过程中对他们俩的经历,以及为什么我们选择从可可足类转变为迦太基。 在项目开始时,选择“迦太基”或“ Cocoapods”可能与我们讨论“构建时间”无关,因为使用的框架数量可能很少。 当您的项目开始增长并向其中添加更多框架时,构建时间就成为一个问题,因为在较长的构建时间中开始浪费大量的开发时间。 在Hercules开发期间,我们意识到在项目中执行干净命令后,在构建过程中损失了大约15分钟,而在执行存档时损失了大约20分钟。 此时,我们使用了17个框架(其中一些框架与Realm,Firebase,Facebook SDK和Google SDK相当),而Cocoapods作为我们的软件包管理器。 我们的构建时间简直太糟糕了,我们不得不为此做些事情。 到那时,我们已经使用了整个冲刺来分析和检验假设,以改善这种浪费的时间。 我们从分析构建时间开始,寻找哪些关键点花费太长时间来编译。 尽管我们的项目很大(+230个源文件),但我们意识到编译源文件所花的时间并不是问题。 在每次“清理和存档”期间发生的事情是,花费大量时间来编译所有框架源文件。 之所以发生这种情况,是因为Cocoapods在每次构建过程中都将框架源文件作为项目的一部分进行附加。 这意味着,即使您从未接触过这些文件,每次执行“清理”操作也会清除所有框架源文件。 您多久修改一次外部框架文件? 您可能会同意我的看法,几乎永远不会同意。 从那时起,我们决定从Cocoapods转到Carthage,成为我们独特的包裹管理器。 我将从使用迦太基的缺点之一开始。 当我们开始切换所有框架时,我们意识到其中的一些框架不支持Carthage-Google SDK,Firebase框架,Facebook pop和Fabric Analytics。 这意味着我们必须手动导入所有这些框架。 尽管这样做不是很大的问题,但这是我们在Cocoapods中所没有的额外工作。 另外,某些框架手动安装(例如Facebook pop)必须通过将框架PBX添加为主PBX的子项目来完成,这与通过Cocoapods添加它的行为类似,因为框架源文件将在每次构建时进行编译。 手动导入所有必要的框架后不久,我们遇到了迦太基的第二个负面问题:第一次carthage update 。 使用no-use–binaries标志在本地编译所有框架大约需要1个小时,这迫使所有框架都在本地编译。 尽管在执行了所有这些烦人的更改之后,我们还是开始收集使用迦太基的好处:清洁后2分钟的构建时间。 编译Facebook pop框架花了大约20秒钟,该框架必须作为子XCode项目导入,其余时间则编译我们自己的源文件。 从那时起,我们意识到由于Cocoapods自动对我们进行手工操作,从Cocoapods切换到Carthage最初很烦人,但是由于Build Time的减少,它为我们节省了巨大的开发时间。 同样,执行“存档”将与“清理”后编译代码的速度一样快,这意味着如果您频繁执行手动发布,迦太基将节省您的时间。 摘要 椰子足 尽管Cocoapods是更成熟的工具,具有更多的框架,并且超级易用,但它可能使您头疼,无法执行干净的构建并不得不等待所有框架的源文件进行编译。 另外,Cocoapods是集中式解决方案,因此请准备好开始失去对PBX / Workspace文件的控制,因为从现在开始,Cocoapods将开始控制并在某些您可能不会注意到的地方进行一些更改。 迦太基 到目前为止,我们注意到的两个负面问题是,如果您决定使用本地编译,则需要花费大量时间来编译所有框架,并且有必要手动导入一些框架。 虽然,我们在使用迦太基时节省的构建时间使初始负数变小了。 杂种 即使我之前没有提到,您也可以使用混合解决方案:Cocoapods和Carthage一起使用。 但是我认为后果很直观:您将从这两种工具中继承正负两点。 这就是我和我的团队同时使用两个程序包管理器的经验。 希望本文可以为您提供任何帮助,以便您更好地选择一个。 感谢您的阅读,并考虑在below下面留下评论/反馈

Swift集合类型

本周,我将总结我在Swift书的“集合类型”一章中阅读的重要方法/概念。 所以,让我们开始吧🙂 Swift提供了三种主要的集合类型,称为数组,集合和字典,用于存储值的集合。 数组是值的有序集合。 集是唯一值的无序集合。 字典是键-值关联的无序集合。 数组 数组将相同类型的值存储在有序列表中。 同一值可以在数组中的不同位置多次出现。 创建一个空数组: var perfectNumbers = [Int]()//https://en.wikipedia.org/wiki/Perfect_number var名称= [String]() 创建具有默认值的数组 var threeDoubles = [Double](计数:3,重复值:0.0) 将一个数组追加到另一个数组 var anotherThreeDoubles = [Double](count:3,重复值:2.5) var sixDoubles = threeDoubles + anotherThreeDoubles 使用数组文字创建数组 var动物= [“猫”,“狗”] var primeNumbers = [1,2,3,5,7] 访问和修改数组 可以通过方法/属性或使用下标语法来完成。下面列出了两个有用的方法: count —查找数组中项目数的方法 isEmpty —查找数组是否为空的方法 append —将项目添加到数组的末尾 + = 运算符—与append方法相同的功能 insert(_:atIndex 🙂 —在数组中的特定索引处添加项目 下标索引可用于访问/修改某个索引处的项目。 即使替换值集的长度与原始值的长度不同,它也可以用于立即更改值的范围 […]

领域数据库:替换SQLite和核心数据第2部分到第2部分

并且,在viewDidLoad()函数末尾调用此设置函数: override func viewDidLoad() { // … existing function … setupRealm() } 现在编辑add()函数,如下所示: 这会删除guard块中以self.开头的两行self. 并用let代替它们try! 该块实际上将向Realm写入新任务。 最后,我们需要允许非TLS网络请求与我们的本地同步服务器通信。 右键单击Info.plist文件,然后选择“打开为…源代码”,然后将以下内容粘贴到部分: NSAppTransportSecurity NSAllowsArbitraryLoads

位置跟踪器pt。 2:扩展“每个用户的数据库”模式

想要将您的应用程序扩展到数百万用户,同时保持将私有信息安全可靠地(轻松地!)同步到Cloudant的能力吗? 在本教程中,我们将向您展示如何进行。 在“位置跟踪器”(第1部分)中,我们向您展示了如何创建一个iOS应用程序来跟踪您的位置,与Cloudant同步以及执行地理位置查询以查找附近的兴趣点。 我们向您展示了如何使用每用户数据库设计模式来利用Cloudant强大的同步功能,同时确保用户的位置信息保持私有。 我们还讨论了“每用户数据库”设计模式如何适合中小型应用程序,但是当您希望扩展到数百万个用户时,效果不那么理想。 在本教程中,我们将向您展示如何扩展Location Tracker来做到这一点。 复习 Location Tracker应用程序是在Swift中开发的iOS应用程序,可跟踪用户位置并将这些位置同步到Cloudant。 当用户移动并记录新位置时,该应用会查询服务器以获取用户位置附近的兴趣点。 以下是“位置跟踪器”应用的屏幕截图。 蓝色图钉标记应用程序记录的每个位置。 在用户行进的路径上绘制了一条蓝线。 每次Location Tracker应用程序记录新位置时,都会在Cloudant中执行基于半径的地理查询,以查找附近的兴趣点(在应用程序中称为“地点”)。 半径由绿色圆圈表示。 位置显示为绿色图钉。 在第1部分中,我们确定了Location Tracker应用程序的五个关键要求: 跟踪前景和背景中的位置。 使用地理空间查询来查找指定半径内的兴趣点。 离线运行。 将用户位置信息保密。 提供合并和分析所有位置的功能。 为了满足要求#4和#5,我们实现了每个用户数据库的设计模式。 这是学习如何使用Cloudant Sync同步个人或私有数据的重要第一步,但是当扩展到数百万甚至数万个用户时,此设计会出现问题。 Glynn Bird在这篇文章中指出了使用每个用户数据库模式进行扩展的一些问题: 备份-如何为数百万甚至数千个数据库设计备份和还原计划? 报告-您如何在数百万个数据库中生成报告? 变更控制-如何在数百万个数据库中传播数据更新? 为了帮助提供针对这些问题(以及更多问题)的解决方案,一组IBM员工构建了Cloudant Envoy。 Cloudant Envoy FTW! Cloudant Envoy是一种微服务,可充当您的PouchDB Web应用程序或基于Cloudant Sync的本机应用程序的复制目标。 Envoy允许您的客户端代码采用“每个用户一个数据库”的设计模式,将用户数据的副本存储在移动设备上,并在联机时同步到云中,同时将所有用户的数据无形地存储在一个大空间中。数据库。 这样可以防止在添加用户时发生的数据库激增,并简化备份和服务器端报告。 这就是在GitHub上描述Cloudant Envoy的方式。 让我们分解一下此描述,并解压缩Location Tracker的相关点: Cloudant Envoy是一种微服务,可充当您的PouchDB Web应用程序或基于Cloudant Sync的本机应用程序的复制目标。 在第1部分中,我们展示了Location Tracker iOS应用如何针对Cloudant中特定于用户的数据库进行复制。 […]

Swift4中使用MVVM的流程协调器[第1部分]

将所有逻辑嵌入ViewController会导致iOS应用程序开发中一个著名的问题,称为Massive View Controllers。 建筑师和开发人员开始采用新的体系结构来解决此问题。 所采用的一种这样的体系结构是MVVM(Model-View-ViewModel),它已在iOS应用程序开发中非常普遍(与RxSwift结合使用)。 MVVM使您可以取消应用业务逻辑的耦合,并可以测试用例和用户界面。 这导致可重用性和更好地维护代码库。 使用Segue在iOS中可以轻松实现视图控制器之间的导航。 它的易用性和可视化布局可见性将吸引您将所有导航逻辑都包含在视图控制器和情节提要中。 但是从长远来看,这将导致巨大的耦合和可重用性问题。 为了解决此问题,MVVM体系结构中采用的一种更清洁的方法是流程协调器。 协调器是基本的Swift对象,可以封装导航逻辑并使组件可重用。 本教程演示了将现有基于情节提要的代码重构为协调器导航流程的开始步骤。 在本集中,我们将从重构使用基本MVVM构建的现有代码库开始。 我们介绍了Flow协调器,用于将导航逻辑与Segue和ViewController分离开,并将其移至Coordinators。 我们定义了所有协调员都需要遵守的协议,并且协议定义引入了childCoordinators,这让父级协调员拥有一个引用,直到弹出或关闭它们为止。 如果您喜欢这些教程的质量,请喜欢,订阅和分享。 请观看以下链接提供的所有剧集: 第1集-https://youtu.be/fH9paWpCvQs 第2集-https://youtu.be/qLbUzwZrQjc 第3集-https://youtu.be/qLbUzwZrQjc 第4集-https://youtu.be/b1GadsUtB9s 第5集-https://youtu.be/EZtCOQyRK7w 第6集-https://youtu.be/T0yT6J_Mp9U 第7集-https://youtu.be/ur-U9nzazbc 第8集-https://youtu.be/6KC1GdLnez0 第9集-https://youtu.be/fT_VI1SiapQ 第10集-https://youtu.be/KvDd1JTCWC8 第11集-https://youtu.be/PnEOgW7Ccig 观看其他TOP编程教程,网址为: youtube.com/c/letscodeeasy 请关注我们: http://letscodeeasy.com www.facebook.com/letscodeeasy https://twitter.com/letscodeeasy

自定义键盘教程

在Swift 4中为iOS创建自己的键盘 介绍 在本教程中,您将学习如何使用Xcode和Swift 4为iOS应用程序创建自己的键盘。 自定义键盘是不允许做的事情,并且访问很多东西,要知道允许什么和不允许什么,我强烈建议阅读以下链接www.apple.com.br上的Apple文档。 开始吧 首先,您必须创建一个新的Xcode项目并选择一个单视图应用程序 。 我将项目命名为自定义键盘教程。 在Main.storyboard中,您必须添加UITextField 。 之后,您必须在ViewController.swift中为此UITextField创建一个出口。 出口与UITextField连接后,必须在viewDidLoad()中添加一行代码。 在下面的代码行中,应用将在打开时显示键盘。 Xcode将使用您选择的产品名称在您的项目中创建一个新文件夹。 有两个文件,KeyboardViewController.swift和info.plist。 这是KeyboardViewController中的一些代码。 要开始创建我们自己的键盘,请清理viewDidLoad方法上的代码。 现在,该创建键盘布局了。 单击键盘文件夹,然后选择“ 新建文件”,然后选择“ 查看” 。 输入视图名称并创建。 Xcode然后将新的xib文件添加到键盘文件夹中。 您将在该文件中创建键盘布局。 在本教程中,我们将“ 检查器”>“模拟指标”中的“大小” 从“推断”更改为自由格式,并将宽度更改为320,将高度更改为160,如下图所示。 配置视图大小之后,该添加键盘按钮了。 我将在视图中添加4 UIButton。 现在选择了文件的所有者,您必须将KeyboardViewController.swift设置为自定义类。 转到KeyboardViewController.swift,有一个名为nextKeyboardButton的插座,您必须将标题为change keyboard的按钮设置为对此插座的引用,并且它们会为其他按钮创建IBAction。 配置插座和操作后,让我们创建一个全局变量,该变量负责向自定义键盘提供文本上下文。 ViníciusCano Santos和Guilherme Gatto制作的教程

Swift中的强引用,弱引用和无主引用

Swift依靠自动引用计数(ARC)通过在对象的强引用为零时释放对象的内存来管理对象的生命周期。 但是,当两个对象彼此保持强引用时,可能会发生强引用循环。 强烈 参考 强大的参考保护 ARC释放对象后,其保留计数增加1。 默认情况下,对类实例的引用是强的。 基本上,只要任何东西都强烈引用对象,就不会释放该对象。 如下面的示例所示,当流程是从父级到子级时,可以使用强引用。 当我们将对象设置为nil时,会同时调用instrument和player deinit方法。 强参考循环–内存泄漏 现在,我们将一个玩家数组添加到Instrument实例(第3行),并在初始化一个Player实例(第5行)时,将其添加到该乐器的玩家数组(第22行)。 当我们将实例设置为nil时,不会调用instrument和player的deinit方法。 当我们将乐器实例设置为nil时,ARC会检查是否有一个实例保留对其的强引用,并且由于存在一个播放器实例对其具有强引用,因此不会释放该对象( 强引用周期 ),这导致我们陷入所谓的内存泄漏 。 弱引用 弱引用不能防止对象被ARC释放(它不会将其保留计数增加1),并且始终是可选的 。 弱引用只是指向对象的指针,该指针不能保护对象免遭ARC释放。 当不再有对它的强引用时,该引用将被更改为nil。 我们可以使用弱引用以避免强引用周期和内存泄漏(第17行): 当Instrument设置为nil时,唯一引用该实例的实例是播放器实例,并且由于它是弱引用,因此ARC会释放Instrument实例。 多余的参考 无主引用类似于弱引用(ARC不会将其保留计数增加1),但是具有额外的好处,这是非可选的。 无主引用是非归零的。 这意味着当对象被释放时,它不会使指针归零。 正如我们在下面的示例中看到的那样,将弱引用(第17行)更改为无主​​引用,其结果与以前相同。 根据Apple的文档: 仅当确定引用始终引用尚未取消分配的实例时,才使用无主引用。 如果在释放该实例后尝试访问一个未拥有的引用的值,则会收到运行时错误。