Tag: 编程

在没有Xcode构建系统的情况下构建iOS应用

(本文最初是为我的博客 vojtastavik.com撰写的 ) 尽管其名称听起来很吓人 ,但是构建系统只是一个常规程序,它知道如何构建其他程序。 作为iOS开发人员,您当然熟悉如何使用Xcode构建项目。 您转到Product菜单,然后选择Build ,或者使用, ⌘B键盘快捷键。 您可能还听说过Xcode命令行工具。 它是一组工具,使您可以使用xcodebuild命令直接从终端构建Xcode项目。 用于自动化流程(例如在CI上)的非常方便的事情。 不管您如何启动它,建筑物本身都是由Xcode的构建系统编排的。 我们是否可以在没有Xcode的构建系统的情况下复制构建过程并“手动”构建应用程序? 是否可以对生成的应用程序进行签名 ? 甚至将其部署到实际的iOS设备上? ⚠️ 免责声明 1⚠️ 这篇文章是关于什么的: 编写一个不可重用的脚本,以最简单的方式构建一个具体的iOS项目。 这篇文章的目的不在于: 编写一个复杂而通用的构建系统。 我让Xcode 10.0使用Single View App模板生成一个新项目,并将其命名为“ ExampleApp”。 这将成为我们将尝试“手动”构建的参考应用程序。 我所做的项目的唯一调整是在主(也是唯一的) ViewController添加带有🎉的UILabel 。 我还在项目的根文件夹中创建了build.bash文件。 我们将使用此文件作为实际的构建脚本。 不要忘记通过在终端中运行以下命令来使文件可执行: $ chmod +x build.bash ⚠️ 免责声明 2⚠️ 其应如何构建应用程序的完整“食谱”包含在其 xcodeproj 文件中。 本文不是关于如何解析和从中检索此信息。 为了本文的目的,我们将忽略项目文件。 为了使我们的生活更轻松, 我们将所有细节(例如项目名称,源文件或构建设置)直接硬编码到构建脚本中。 让我们从一些整理工作开始。 我们需要定义并创建在构建过程中将要使用的一组文件夹。 ################################################ ########### #build.bash […]

堆栈

在舒适地使用了数据结构数组和字典之后,我将探索诸如Stacks和Queues之类的不熟悉的数组。 在本文中,我们将重点介绍Stacks。 排队等待我有关队列的文章。 堆叠—遵循后进先出(LIFO)的顺序。 1. PUSH —只能将元素推到堆栈的顶部 2. POP —从堆栈顶部删除元素 3. PEEK-窥探堆栈顶部的元素 将一堆书想象成一堆书,但要用书本的内容代替书而不是书(而不是心脏……哈)。 在生活中,您不想遇到任何泛型,但是在为Stack编写代码时,我已经使用泛型实现了进一步的可重用性。 让我们大致了解一下实际发生的情况。 我们有一个变量数组,仅对我们正在使用的文件具有有限的访问权限。 在该数组中,每当我们添加一个元素时,该元素都会作为最后一个元素添加,如果您尝试删除元素,则最后一个添加的元素也会被删除。 最后,您只能看到堆栈中的最后一个元素。 这是Stacks的一个更有趣的版本。 我创建了一个名为Lannister的结构,然后继续创建三个相同类型的对象Lannister。 然后,我将这些元素放入Lannister堆栈中,并能够获得对我已推送的所有内容的描述。

使用Swift设计多线程应用程序

作为汽车行业的iOS开发人员,我花了大量时间处理实时数据。 在当今的许多应用中,有效处理连续数据流的需求非常重要。 为确保不锁定用户界面,您很可能需要使用多线程。 实时流式传输的信息最有趣,因为您将不断收到可用于更新视觉效果的新数据。 这也是您最困难,最令人沮丧的事情,因为iOS设备在硬件方面有一定的局限性。 幸运的是,Apple通过称为GCD(大中央调度)的极其易于使用的界面提供了多线程。 您可能熟悉看起来像这样的代码: 如果您没有将主程序代码显式放置在另一个队列中,那么它将在其中运行大多数程序代码。 这是一个串行队列,这意味着它将选择行中的第一个项目,执行代码,等待它完成,然后释放该项目,然后选择行中的下一个项目,依此类推。 但是,主队列并不是通过GCD可用的唯一队列。 有许多预定义的队列都具有不同的优先级。 您还可以通过以下方式创建自己的专用队列: 请注意,我们刚刚创建的队列具有.concurrent属性,这意味着该特定队列在执行下一项之前不会等待一项完成。 它将简单地将第一个项目放在线程中并启动它,然后继续进行下一个项目,而不管第一个项目是否完成。 假设您正在处理采样率约为20Hz的数据流。 这意味着您将有大约50毫秒的时间来解析和解释数据,将其添加到数据结构中,并告诉视图进行显示。 如果您的iOS设备尝试在主线程上执行此操作,则将几乎没有时间检查用户是否尝试与该应用程序进行交互,并且您的应用程序将变得无响应。 这就是我们转向多线程的地方。 假设我们使用一个非常简单的数据结构来存储我们收到的数据样本,即一个普通的整数数组。 我们可能很想创建一个队列并像这样使用它: 看起来不错吧? 现在,我们正在后台线程上进行所有数据处理,而主线程仅用于更新视觉效果。 但是,这势必会崩溃。 但为什么? 答案有点技术性,但是考虑这一点很重要。 由于我们的队列是并发的,因此它将在线程上抛出要并行执行的工作项。 我们还将数组用作数据存储。 Swift数组是一种结构类型,这意味着它是一个值类型。 当您尝试将值附加到这样的数组时,您将: 分配一个新数组并复制旧数组中的值 追加新数据 将新引用写回您的变量 系统继续释放旧阵列使用的内存 想想如果两个线程将相同的数组复制到它们,然后将自己的数据附加到副本,然后将新的引用写回到我们的变量(一个在另一个之前,或者两个在同一时间)会发生什么。 第一种情况会给我们不正确的数据,因为首先写入的线程所写的数组中会丢失首先写入的线程中的数据。 第二种情况将导致我们的应用程序崩溃,因为两个线程无法同时获得对分配的内存的写访问权限。 考虑到这一点,我们可以使用DispatchQueue类附带的非常聪明的构造,即标志。 现在,我们可以像这样更改代码: 这看起来令人生畏,但我将解释它的作用。 每当添加一个将通过写入而更改数据结构的项目时,通过使用.barrier标志,我们告诉队列该特定工作项将需要自己执行。 这意味着队列将需要等待所有正在运行的线程完成,然后运行该项目并等待其完成,然后它才能再次开始并行执行代码。 当主线程需要访问数据以更新我们的视图时,它需要通过同步调用来遍历数据队列。 如果不这样做,则存在我们编写线程之一随时损坏其正在读取的数据的风​​险。 希望您能成功并从中获得一些新知识。 几天后重新阅读一遍可能会有所帮助,让自己有机会进行反思。 如果您有任何疑问,请随时发表评论,然后继续获取有关未来文章的通知。 要了解有关iOS开发的更多信息,可以查看我以前的文章: iOS开发和错误的MVC类型 作为iOS开发人员开始时,您会听到很多有关MVC(模型-视图-控制器)模式及其状态的信息。 medium.com

使用Sentry自动化错误处理的快速入门

Sentry是一个用于跟踪应用程序错误的出色工具,在本简短指南中,我将向您展示如何将其添加到iOS应用程序中。 注册新账号。 您是一名开发人员,我希望我不需要逐步介绍。 2.如果没有设置CocoaPods,请安装它并在项目目录中运行pod init,它将引导您完成创建Podfile的操作 11.将绝对路径复制到脚本中,并将其粘贴到编辑器框中 12.你做完了✅! 您现在可以自动跟踪错误。 🥳

iOS编程入门

因此,您想为iPhone和iPad创建应用程序吗? 创建应用程序是您生活中充满乐趣和挑战性的体验。 让我们深入研究iOS编程 1.什么是iOS? iOS是Apple Inc.开发的移动操作系统。它于2007年发布,iOS设备为iPhone,iPad,iPod touch。 iOS版本 iPhone操作系统 iPhone OS 2 iPhone OS 3 iOS 4 iOS 5 iOS 6 IOS 7 iOS 8 iOS 9 iOS 10 iOS SDK是一个软件开发工具包,它使开发人员可以编写适用于iphone,ipad和ipod touch的应用程序。 它包含Xcode IDE,模拟器,框架,工具,编译器和一些示例等。 2.购买Mac 创建iOS应用的基本要求是拥有Mac。 如果预算较低,请使用Mac mini。 Mac mini的基本型号配备1.4GHz双核Intel Core i5处理器,4GB的1600MHz LPDDR3内存和500GB的硬盘驱动器。 该模型足以运行Xcode。 3.安装Xcode Xcode是Apple提供的集成开发环境(IDE)。 Xcode允许您为每个Apple设备开发应用程序。 它与最新的iOS SDK(软件开发套件),源代码编辑器,调试工具,界面生成器等捆绑在一起 要下载和安装Xcode,您必须具有Apple ID。 所以,如果您没有Apple ID? 只需单击此处。 创建Apple […]

在Xcode中跟踪构建时间

当然,某些语言或模式意味着您可以用更少的代码来做更多的事情,但是请听我说…… 假设完成一项功能需要10行(当然包括测试)。 不花时间写那10行,就不会使您更接近完成功能。 会议,reddit,编译等都使您无法集中精力实现目标。 您无法更快地键入那10行,您已经以124 WPM的速度键入。 为了提高工作效率,您必须停止阅读reddit并优化编译时间。 WakaTime不能阻止您阅读reddit,但是我们可以跟踪您等待构建完成编译的时间。 有了这些信息,您可以确定项目中的编译缓慢,并采取措施优化构建。 从Xcode开始,我们在WakaTime仪表板上增加了您花费在编译代码上的时间。 要跟踪您花费在等待构建和编码上的时间,请为Xcode安装WakaTime插件。 最初于 2018 年4月10日 在 wakatime.com 上 发布 。

我对Xcode 10感到兴奋的7个理由

我们都在工作到很晚的时候打开了Xcode,并且被界面所蒙蔽。 我的眼睛仍然没有原谅我。 幸运的是,Xcode 10可以通过新的黑暗模式防止这种情况。 2.多行编辑 这是我最喜欢Atom的东西之一。 它使您可以快速快速地真正编辑多行。 按⌥+↓+⇧或CTRL + down + shift 。 3.侧面栏中的Git更改 我很高兴Xcode采纳的另一个Atom功能是边栏中的git changes。 在必须打开“源代码控制”面板然后浏览所有更改之前,打开文件并查看所做的更改很酷。 这使得管理git更容易。 4.翻页 另一个Atom插件功能! 过度滚动似乎没什么大不了的,但是使用完后就无法返回。 5. CreateML游乐场 今年夏天初,我写了一篇关于如何使用TuriCreate创建自己的CoreML图像分类器的方法,这非常简单,但是现在您可以在Xcode Playgrounds中创建CoreML模型。 基本上,只需拖放即可弹出CoreML模型,准备在您的应用程序中使用。 观看此WWDC视频,以了解有关在Xcode Playgrounds中使用CreateML的更多信息。 介绍创建ML – WWDC 2018 –视频– Apple Developer Create ML是一个新框架,旨在帮助您使用Swift和Xcode轻松构建机器学习模型。 设计… developer.apple.com 6.改进的SceneKit编辑器 如果您使用ARKit或Scenekit,这将帮助您节省大量时间。 还有很多选项可以显示诸如线框 , 边界框 , 骨架等内容。 3D设计师欢欣鼓舞! 7.代码折叠色带 这不是我每天都会使用的东西,但是我认为代码在调试大型函数或进入地狱时确实很有用。 跟我来了解有关Xcode,Swift和iOS开发的更多提示 改善Xcode工作流程的提示 Xcode是创建iOS应用的绝佳工具,但有时可能会有些笨拙,并会拖慢您的工作流程。 这里… medium.com

构建像Lego这样的应用程序—教程12

用图像,标签和按钮插座构建自定义的“产品”单元。 1.简介 在本教程12中,我们将使用“自动布局”,堆栈视图,图像视图,标签和按钮为“产品”场景构建自定义单元格布局。 表格视图将动态调整单元格的大小以适合内容。 2.从这里开始 在教程11中,我们通过自动调整单元格高度来结束“新闻”场景。 如果您从那里继续,那么您将拥有所需的一切。 跳至步骤3。 如果您想从本教程重新开始 ,可以按照以下步骤下载项目: 👉启动终端应用程序(从“应用程序”文件夹中)。 Terminal在终端中,输入:cd〜 cd ~/Documents ,然后按Return 。 👉将以下内容粘贴到Terminal中,然后按Return : git clone –recurse-submodules –branch Start-Tutorial-12 https://bitbucket.org/barefeetware/lego-tutorial-social.git Terminal在终端中查看下载进度,然后等待下载完成。 👉在您的Documents文件夹中,打开lego-tutorial-social文件夹。 👉打开Social.xcode.proj文件。 本教程假定您知道如何完成本系列中已经介绍的任务。 如果不确定,请回顾以前的教程中更详细的步骤。 3.删除文件 在将更多文件添加到项目之前,让我们删除一些不再需要的文件。 当我们第一次创建项目时, FirstViewController.swift和SecondViewController.swift文件是作为Tabbed App模板的一部分创建的。 我们已经从使用这些文件的情节提要中删除了场景(并用“新闻和产品”场景替换了它们),因此我们也可以删除这些Swift文件。 👉在项目浏览器中单击FirstViewController.swift文件一次。 按键盘上的delete键。 Xcode提示您进行确认。 单击Move to Trash按钮。 👉同样,单击SecondViewController.swift文件并将其删除(即, Move to Trash )。 Project Navigator显示这些文件已消失。 或者,我们可以单击第一个文件,按住Shift键单击第二个文件,以选择两个文件,然后按Delete键立即将两个文件删除。 4.产品单元 让我们使用在教程7中创建“新闻”单元时所学的知识,快速创建“产品”单元。 我们的目标是像在Lego中一样将子视图组装成堆栈视图。 👉控制单击或右键单击“ Social组”文件夹。 在出现的弹出菜单中,选择“ […]

Swift中的出租人已知功能

上一次,我们研究了Swift标准库中Array及其相关类型的一些功能。 在本文中,我们将研究AVFoundation和URLSession中的一些框架功能,以及带有日期格式的键编码的新Swift 4.1功能。 让我们开始吧! AVMakeRectWithAspectRatioInsideRect 我们不会深入研究AVFoundation框架,但是AVFoundation有一个方便的功能,在处理图像时非常有用。 它是AVPlayerLayer的一部分,称为AVMakeRectWithAspectRatioInsideRect CGRect AVMakeRectWithAspectRatioInsideRect(CGSize AspectRatio,CGRect boundingRect); AVFoundation框架中的此功能对于调整照片的大小以匹配图像视图的大小非常有用,例如在UITableViewCell或UICollectionViewCell 。 确保图像的大小与UIImageView的大小匹配(或接近UIImageView的大小)是一项重要的性能增强。 动态缩放图像可能会很昂贵。 调整大小可减少对分配给图像视图时必须重新缩放图像的系统的影响。 当您知道最终尺寸的一个方面(例如宽度)并且想要计算尺寸以在保留宽高比的同时重新绘制图像时,此功能很有用( 注意 :矩形的高度和宽度之间的比例关系为长宽比)。 假设您有一个包含两列的UICollectionView ,其宽度根据屏幕尺寸是固定的,并且您要根据集合视图单元格的宽度将图像的大小调整为保持纵横比的高度。 首先,使用适当的大小约束(在这种情况下为宽度)创建一个边界矩形,将边界矩形与原始图像的大小一起传递给AVMakeRect函数,以获取一个新的矩形,该矩形保持长宽比。 在代码示例中,原始图像为1276 x 800,宽高比为1.595(1276/800 = 1.595)。 边界矩形宽度设置为300,这将导致纵横矩形大小为300 x 188,并保持原始图像的纵横比为1.595。 URLSession等待连接 每个应用程序都需要联网功能,从而使URLSession成为Foundation框架的重要组成部分。 我们经常使用可达性来确定是否由于缺乏可达性而导致失败的网络请求(首先要检查您的可达性?请查看这篇文章),但是您是否知道在iOS 11中向URLSessionConfiguration添加了URLSessionConfiguration名为waitsForConnectivity的新属性? 如果在发起网络请求且没有连接时将此属性设置为true ,则URLSession将在URLSessionTaskDelegate上调用urlSession(_:taskIsWaitingForConnectivity:)并等待连接。 连接恢复后,任务将正常开始工作。 如果我们具有此功能,则可以使用委托回调来更新我们的UI和/或切换到离线模式。 我们可以通知用户连接可能存在问题,并让他们知道任务将等待连接,然后自动恢复或允许他们取消请求。 文档中有关此功能的重要说明: 每个任务最多调用一次此方法,并且仅在最初不可用连接时才调用此方法。 永远不要为后台会话调用它,因为这些会话将忽略waitsForConnectivity 。 这意味着,如果您具有连接性,但是连接断开,则不会调用此方法。 在这些情况下,Apple的文档将我们引向以下技术问答QA1941文档。 简而言之,根据请求类型( GET或PUT)您可以重试该请求,但是POST请求是一种特殊情况,您的应用应使用应用需求提供的自定义逻辑来相应地处理任何POST重试请求。 托收平等 Swift 4.1在集合上引入了一项新功能,即测试是否相等。 这是通过新的语言功能实现的,该功能可自动将类型合成为Equatable和Hashable协议。 在Swift 4.1中,数组(和字典)是Equatable ,只要它们的基础值也是Equatable 。 […]

Swift 4中的闭包简介

苹果,什么是瓶盖? 闭包是可以独立传递的功能块,可以在代码中传递和使用。 – 苹果 别担心,如果那没有道理。 起初,这听起来像: 闭包是一堆自成体系的单词,就像该死的篮球一样。 如果您不知道,操场上可能有一个篮球场。 去看看吧。 – 苹果 目的 在什么,如何以及在什么地方介绍闭包。 什么是封闭 闭包采用以下三种形式之一: 全局功能 嵌套函数 闭包表达 前两个是闭包的特殊情况。 如果您不知道函数如何工作,请在此处为您提供一篇文章: Swift 3中的主函数 当我们谈论Swift中的闭包时,我们经常提到闭包表达式。 如果有一件事可以帮助您记住什么是闭包,就是这样: 闭包是无头功能 。 闭包是没有func关键字和函数名称的函数。 它们也称为匿名函数。 它们本身不能像函数一样调用,因为它们没有名称。 它们结合使用。 封闭语法 由于其语法简单,因此鼓励使用闭包。 功能与关闭 以下是函数和闭包之间要记住的主要区别: 功能 有个名字 具有func关键字 没有关键字 关闭 没有名字 没有func关键字 有关键字 限定 让我们看看如何定义函数与闭包。 func GiveAFunc(){} var GiveNoFunc = {()->()in} 注意:我们的闭包以{开头,以}结尾。 我们将闭包存储在变量内,因此可以调用它。 呼叫 让我们调用一个函数,然后调用一个闭包。 GiveAFunc() […]