XCode iOS版新游戏-第1部分

Pre guntas porque en los视频教程,没有重要的解释性的los复选框,opciones y otras cosas que aparecen al inicio de un proyecto en Xcode… Muchas veces cuando iniciaba在Xcode上使用了程序化的iOS应用程序,并在comenzaban con algo como上播放了视频教程: “ Iniciamos el proyecto pulsando 创建一个新的Xcode 项目,seleccionamos Single View Application ,ponemos x nombre yces 连续式”我的预告片是“¿? “ Bien empecemos por laprima vista al abrir Xcode y si no conoces parkaún,descubrirásla mina de […]

加快Xcode构建

随着项目的发展,构建时间可能会成为问题。 但是,您可以对Xcode进行一些调整,这些调整可以减少无需任何额外工作即可完成构建的时间。 增加线程数 : 默认情况下,Xcode通常使用与计算机CPU中相同数量的线程。 但是,通过将线程数增加到默认值以上,可以显着减少构建时间-在某些情况下可以减少30%。 这利用了某些处理器对多线程或仿真其他内核的能力。 请记住,您可能需要尝试确定代码库中并行生成的收益是否递减,然后相应地调整线程数。 启用新的构建系统: Apple的“新构建系统”完全用Swift编写,旨在提高整体性能和依赖性管理。 请注意,虽然新版本系统在Xcode 9+中可用,但是必须在Xcode的Project / Workplace Settings下启用它,因为“ Standard Build”将是默认选项。 或者,可以通过命令行启用“新构建系统”(详细信息在下面链接)。 您可以在此处找到更多详细信息和启用新构建系统的说明: Xcode用于快速Swift构建的新构建系统 调整iOS模拟器: ãApple iOS测试模拟器可让您跨不同的软件和硬件组合进行测试(但仅限于Mac)。 通过使用“物理尺寸”或“像素精确”窗口尺寸,您既可以减少测试的大小,又可以减少完成测试所需的时间。 最终,这些配置更改将使用更少的资源,并有助于在模拟任何人都看不到的像素完美的iPhone阅读器时防止测试变慢。 您可以在此处找到配置说明:调整Xcode iPhone模拟器的比例和大小 使用并行化的构建: 并行构建可以通过构建不同时依赖于彼此的应用程序组件来减少Xcode的构建总时间。 对于可以轻松并行运行的,具有许多较小依赖项的项目,可以节省大量时间。 收益显然取决于代码的编写方式,但是值得测试,因为默认情况下未启用并行化构建。 您可以通过编辑Xcode方案并在方案的构建操作中选中“并行构建”来启用并行构建。 您可以在此处找到有关利用并行化构建的更多详细信息:什么时候应该检查Xcode方案的“并行化构建”? 打开构建时间摘要: 构建时间摘要使您能够报告每个Xcode构建的构建时间。 换句话说,构建时间摘要可以帮助您识别影响构建时间的构建部分,并进一步优化构建顺序以获取整体收益。 构建时间摘要所提供的见解虽然本身并不能解决,但在尝试优化构建时间时,可以在确定工作的优先顺序时很有用。 更大的构建机器: ‍从技术上讲,这不是Xcode的调整,但是较大的构建计算机在尝试加快构建速度时确实产生了巨大的影响。 更高的计算能力仅意味着可以更快地完成流程和构建。 我们的测试表明,从双核Mac mini迁移到12核Mac Pro可以使速度提高3倍,而无需付出任何额外的努力。 当您准备升级或扩展Mac基础架构时,请随时通过MacStadium与我们联系。 ‍其他资源: 当然,这些只是可以用来加快Xcode构建时间的一些建议。 以下资源可以提供有关改善Xcode构建时间的其他信息和建议。 优化Swift代码的编译时间 从iOS Edit-Build-Test周期减少了50%的等待时间 加快Xcode中Swift编译和编译时间的8条技巧 如何使用Xcode 9和iOS 11构建更好的应用程序 ‍ […]

iOS应用验证失败

有时,当我们想在设备上安装另一个iOS应用程序时,可能会遇到ApplicationVerificationFailed 。 这种情况很少见,因为这实际上是环境和手段的结合,您收到的应用程序没有团队的配置文件。 无论如何,我们有能力解决这个问题。 计划: 获得自己的配置文件 退出应用 安装应用 前提 首先,要使我们的生活更加美好和轻松,我们应该安装ideviceinstaller和fastlane : $ brew install ideviceinstaller $宝石安装fastlane 供应配置文件 然后,我们需要获取配置文件。 如果已经有了,则可以跳到下一步,否则,请继续。 正如苹果所说: Xcode是创建iOS供应配置文件的最简单方法。 将设备连接到Mac,然后在Xcode的Organizer窗口中单击Use for Development。 使用与您的Apple Developer Program成员资格关联的Apple ID登录,Xcode将生成一个包含您的证书和设备标识符的配置文件。 因此,在这种情况下,签名类型无关紧要,是个人团队还是组织团队。 退出应用 这里我们需要三件事: .ipa .mobileprovision iOS开发人员证书 我希望您有一个.ipa,我们可以从XCode获得的其他: 所以: 将iOS Team Provisioning Profile从XCode工具提示拖放到带有.ipa的文件夹中 从相同的工具提示中复制iPhone开发人员证书 然后像这样通过fastlane退出应用程序: $ fastlane叹气辞职testapp.ipa –signing_identity“ iPhone开发人员:a.alterpesotskiy@test.com(KJRTP5GJS9)” -p“ test.mobileprovision” 安装应用 。 。 如果看到此弹出窗口,则可以转到设备上的“设置” =>“常规” =>“设备管理 ”,以信任开发人员并允许运行该应用程序(有关更多信息,请参阅Apple文档)。 […]

在本地原生共享库扩展

共享扩展名:React Native和Redux。 他在西班牙干草堆上进行了现场勘查,并在西班牙的埃斯巴萨和西班牙的萨尔瓦多省的萨洛尔河之间进行了考察。 分享到以下内容:扩展名:无限制的扩展名:没有必要的扩展名: ¡阿斯奎·瓦莫斯你好! 从根本上讲,Remote Persist(empleando como storage AsyncStorage )和Obtiene Toda laInformationación中立语言是什么意思,重要的是store和其他store 。 Apple的Android操作系统保护功能可扩展到Android设备上的共享库扩展名,适用于Apple sistemas,Apple Bi estEstéculovoy和ceñirmetan solo al sistema操作Apple的扩展名zh-cn上的Androidescribiréuna segunda parte contando los pasos)。 诺塔 iOS las extensions(tanto las denominadas Share como las Action)上的Antes de comenzar es Importante destacar quesséparados,por a que no tienen acceso la carpetaprinciple laaplicación,es decirs es losdecurséscom的儿子tratadas como contenedores […]

Swift 4.2的新增功能

Swift 4.2是4.1和4.0的主要更新。 该更新主要与改进,代码优化和运行时性能增强有关。 现在,您可以使用Xcode 10.0构建用Swift 4或Swift 3编写的目标。在本文中,我将讨论Swift 4.2中引入的新功能。 让我们一一解决。 取消ImplicitlyUnwrappedOptional (IUO)类型ImplicitlyUnwrappedOptional (IUO) -0054 该建议引入了从Swift中移除ImplicitlyUnwrappedOptional类型,并在声明IUO attribute其替换为IUO attribute 。 您仍将继续使用语法T! 。 但是,使用! 在属性或变量声明的类型末尾,不再表明该声明具有IUO类型。 相反,它表示两件事: 声明具有可选类型。 该声明具有指示其值可能被隐式强制的属性。 (没有人会写或观察该属性,但我们将其称为@_autounwrapped 。)此后,此声明称为IUO声明。 以下是一些示例: // f:()-> Int ?,具有IUO属性 func f()->整数! { 返回 3 } //成功; x1:整数? = 3 令 x1 = f() //成功; x2:整数? = .some(3) 让 x2:诠释? = f() //成功; x3:整数? […]

iOS中具有通用数据模型的自定义可重用数据源。

UITableView和UICollectionView是用于在任何类型的iOS应用程序中呈现数据的两个常见UI组件。但是将这些大数据呈现到单元中并不是什么大问题,主要的问题是我们如何处理这些数据。 让我们以UITableView为例,通常通过在viewController中采用UITableviewDatasource协议一致性,我们可以使用它的一些专用方法来处理tableview内部的数据呈现。 这是简单的代码片段示例 上面的例子非常简单,我们只是为viewController创建了一个扩展,并添加了所有tableview数据源方法。 它是如此的好和简单,但是为什么我应该使用Custom数据源呢? 好的 !!!! 当必须在其他视图控制器中显示这些相同的数据块时,您将怎么办。 没什么大不了的,我也将在其他视图控制器中创建相同的东西。 创建自定义可重用数据源可以处理整个应用程序中的所有数据源逻辑和数据模型渲染部分。我在整个应用程序中都说了。是的,但是不同控制器的数据模型不同,所以我将自定义数据源设置为一个通用模型类型,因此只需使用您的数据模型实例化此自定义数据源,以下是代码段。 在这里,我采用了模型(用于数据模型渲染),reuseIdentifier(用于使TableView单元格标识符出列)和CellConfigurator(它是一个元组,它同时容纳Data模型和UITableviewCell,其工作方式类似于tableview单元格中用于索引处行的闭包)作为参数以上课程。 我还在此类的扩展内部创建了一个静态方法来管理特定的数据模型。您还可以根据需要创建自己的模型。代码段。 扩展TableViewCustomDataSource,其中模型== ItemsDetailsLists {静态函数displayData(用于itemLists:[ItemsDetailsLists],withCellidentifier复用标识符:字符串)-> TableViewCustomDataSource {返回TableViewCustomDataSource(模型:itemLists,reuseIdentifier:reuseIdentifier,cellConfigurator:{(数据,单元格)入口itemcell: ItemListsTableViewCell =单元格为!ItemListsTableViewCellitemcell.setupParameters(itemlist:data)})}} 在您的viewController内部只需创建一个像这样的属性 私人var dataSource:TableViewCustomDataSource ? 这里的ItemDetailsLists是我的数据模型,一旦获得响应,就可以像这样设置您的customdatsouce属性,并将tableViewdataSouce设置为customdatasource。 func renderTableViewdataSource(_ itemlists:[ItemsDetailsLists]){dataSource = .displayData(用于:itemlists,带有Cellidentifier:“ ItemListsTableViewCell”)self.itemListTableview.dataSource = dataSourceself.itemListTableview.reloadData()} 这是完整的源代码Github链接 欲了解更多博客,请点击此链接 参考文献: *重构视图控制器,作者Paul Hudson Swift中可重用的数据源 通过约翰·桑德尔 Shakti Prakash在about.me 我是印度班加罗尔的软件工程师。 查看我的仓库。 关于我

使用Google Cloud Build的Vapor 3的简单CD流水线— git push→Docker容器→GKE中可用的服务

我有一个用Swift 4.1编写的Vapor 3项目,我想创建一个简单的CD管道,以便在每次git push送到分支时(或当有新标签时),都将在Google Kubernetes Engine中构建并部署一个容器,其API可从http://[INGRESS_IP]/projectname/获得,GKE中已配置了一个群集,该群集已配置Istio 1.0作为服务网格和定义的路由。 Vapor 3 Web框架 您可以在https://vapor.codes/上查看有关Vapor 3的更多信息,以及在https://docs.vapor.codes/3.0/上提供的文档。 这里特别令人感兴趣的是Swift 4.1与高性能Apple NIO非阻塞框架的结合。 如果要利用并行计算,多核体系结构和事件驱动的设计模式,则可能希望为项目采用非阻塞体系结构。 Vapor 3还带有一个异步库。 您可以使用的越多,并行化就越多。 云构建 Google Cloud Build是启用CD管道的简单工具; 在触发器方面,它支持推送到git分支和标签(与Google自己的代码仓库,GitHub和Bitbucket的Cloud Source Repository集成)。 已经有很多可用的云构建器可以作为单个步骤添加到管道中( 例如 ,docker,mvn,go,kubectl等)。 创建Dockerfile 配置Kubernetes部署和服务 配置Istio网关和虚拟服务 在cloudbuild.yaml配置管道 在Google Cloud Build中定义构建触发器( 例如,推送,标记) 1.创建Dockerfile 我使用了两个阶段的多阶段Dockerfile: 在Swift 4.1容器映像上构建Vapor 3服务 编译后的文件将复制到干净的生产映像中,从而生成一个小容器。 此示例使用ubuntu:16.04但有些人也使用alpine,显然有一些好处。 我没有尝试过alpine版本,如果它对您有用,请分享您的配置文件和/或评论 #Builder图像-构建代码 #================================================== ============== 来自swift:4.1作为构建者 运行apt-get -qq更新&& rm -r / var […]

iOS面试问题(快速)-第2部分

1.在Swift中解释泛型? 利用GENICS,您可以编写可与任何类型一起使用的灵活,可重用的函数和类型 。 您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。 Swift的Array和Dictionary类型都是通用集合。 在下面的代码中,用于交换两个值的泛型函数用于字符串和整数。 这是可重用代码的示例。 func swapTwoValues (_ a:inout T,_ b:inout T){ 让临时A = a a = b b =临时A } var num1 = 4 var num2 = 5 var str1 =“ a” var str2 =“ b” swapTwoValues(&num1,&num2) swapTwoValues(&str1,&str2) print(“ num1:”,num1) //输出:5 print(“ num2:”,num2) //输出:4 print(“ str1:”,str1) //输出:b print(“ str2:”,str2) //输出:a 2. swift中的可选内容是什么?何时使用可选内容? […]

Swift中的回调

回叫是一个非常有趣的话题,我们经常在Swift /目标C中遇到。在本文中,我们不仅会从理论上了解回叫,而且还将能够理解何时以及如何在代码中使用它们。 在开始之前,让我们先了解一下每次阅读回调时经常遇到的单词。 处理程序/完成处理程序 积木 代表们 关闭 以上所有术语表示同一事物,即“回调”。 它们只是在语法上有所不同。 块/闭包或委托具有不同的语法,但工作方式相同。 注意:我们将在稍后更加详细地了解Blocks,委托和闭包。 什么是回叫? 回调是一个函数或代码块,它将在某个时间点作为参数传递到另一个函数中。 func callback(){ // 做点什么 } func executeCallBack(回调){ //做点什么 } 现在的问题是,我们在哪里以及为什么需要回调。 假设要求我们构建一个应用程序以从服务器下载文件,并以下载百分比或下载完成后更新界面。 有了一个向服务器发出请求并下载文件的功能。 我们不能只是调用该函数并期望它在下载完成后返回,因为下载过程可能需要几分钟到几小时的时间,并且在那之前我们不能阻止UI。 在这种情况下,回调可以挽救。 我们可以使下载功能异步运行,尽管它会在下载完成之前立即运行,但是下载状态可以在实际完成后稍晚更新。因此,您要做的就是将下载功能传递给回调函数,以在下载完成后调用或更新进度百分比。 同样,让我们​​考虑另一种情况。 假设有一个要求,我们希望将数据从弹出窗口传递到呈现视图控制器。 请参考下图。 在这种情况下,还需要回调以将数据从弹出窗口传递到视图控制器,同时将其关闭。 简而言之,我们可以在以下情况下应用回调: 将数据传递到上一个视图控制器或更新UI。 当一个任务正在启动时,它将异步完成(即,将在调用函数返回后的一段时间内完成)。 让我们看一下带有多个回调(Swift 4.0)的以下示例: func downloadMethod(_ params:String, successHandler :@escaping(_ arg:String)-> Void, failureHandler :@escaping(_ error:Error?)-> Void) { //下载文件后成功回调 successHandler (“已成功下载。”) 如果让err =错误{ //如果发生某些错误,则调用失败回调 […]

使用Grand Central Dispatch进行并行计算和编程

我们将使用原生的Grand Central Dispatch( GCD )框架研究iOS上Swift的并发编程。 如果您不熟悉并发编程,建议您先看一下Wikipedia。 让我们开始研究此API背后的哲学和良好实践。 GCD (Grand Central Dispatch)是一个框架,提供低级API来处理iOS,macOS,tvOS和watchOS平台上的并发编程。 苹果公司提供竞争管理的所有更高级别的框架(例如NSOperation )都基于GCD 。 这些API允许您将流程的工作划分为各个任务,然后使用队列帮助协调并行或顺序执行这些任务。 它使我们能够从线程,处理器或核心的概念中抽象出来,并同时利用其自己的线程池来优化资源管理。 GCD所基于的基本概念是FIFO(先进先出)。 我们要执行的任务将首先插入到这些队列中,然后GCD将单独检索它们,以将它们分派到正确的线程/处理器/心脏。 我们可以区分两种文件: 并发文件:并行执行多个任务 顺序或串行 文件:连续执行一对一的任务 这是现有文件的3类: Main queue :等同于主要处理应用程序UI的主线程。 所有UI调用都必须在此队列上完成。 Global queue :系统为我们提供3个具有不同优先级(高,默认和低)的全局尾部。 这3个文件是Concurrent类型的。 Custom queue :可以手动创建并具有所需类型(串行或并发)的队列。 让我们从创建3个队列类别之一开始: 为了创建自定义队列 ,我们首先定义一个标识符(建议使用反向DNS格式)。 现在我们知道了如何创建文件,如何使用它们? 非常简单,这要感谢“调度员”! 这是一个小例子: 让我们分解所有这些。 我们开始创建低优先级队列。 然后,我们在先前恢复的低优先级队列上异步“分发”代码块。 该代码块异步获取数据以将其存储在data变量中。 最后,我们使用恢复的数据更新主线程中的view 。 在主线程中执行最后一步非常重要,因为UIKit不是线程安全的,并且如果您在另一个线程中更新组件,则应用程序可能崩溃或具有未定义的行为。 控制台将在此处显示: 之前 后 内部异步块 在主队列块内 完蛋了! 使用GCD您可以管理所有有关并发编程的问题。 在本节中,我们将进一步介绍不同的使用情况。 […]