驯服无节制的应用程序架构 链接到示例GitHub项目 注意:示例项目在撰写本文时尚未完成,目前只是草稿。 在过去的几个月中,我一直关注的开发领域之一就是构建模块化代码。 我在一月份回信了我尝试重构TaskHero时遇到的挫折感。 当时我说这不是我最后的决定,这是我要花时间反思的问题。 在此期间,我尝试了几种成功实现应用程序模块化的方法。 我发现构建模块化应用程序代码的更成功的方法之一是使用Coordinator设计模式和委托。 这篇文章是关于使用协调器构建应用程序以及使用它的优点/缺点的两部分系列文章的第一篇。 第一部分主要涉及概念和为什么要使用它的原因,第二部分将进一步介绍实现。 我已经建立了一个示例项目,但它还没有最终的形式,更多的是本文撰写时的草稿。 如果您有兴趣查看该示例,欢迎您。 我在顶部发布了指向它的链接。 信用到期 如果您还没有阅读Soroush Khanlou的博客,我强烈建议您开始阅读。 这是一个很好的资源,它帮助改变了我处理应用程序体系结构的方式。 这篇文章的灵感来自他的几篇文章。 我特别建议阅读他有关使用协调器的系列文章。 MVC可能意味着超过一件事 Model-View-Controller及其衍生产品是最常用的应用程序体系结构之一。 苹果定义: 模型-视图-控制器(MVC)设计模式为应用程序中的对象分配以下三个角色之一:模型,视图或控制器。 该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象之间的通信方式。 三种类型的对象中的每一种都通过抽象边界与其他对象分开,并跨这些边界与其他类型的对象进行通信。 在应用程序中,某些MVC类型的对象的集合有时称为“ 层” ,例如模型层。 模型视图控制器 如果您生活在Apple编程世界中,那么您会很快了解到Apple一直在使用MVC架构。 实际上,MVC嵌入了UIKit的核心。 虽然MVC是一种非常有用的设计模式,但是如果处理不当,则会存在一些缺陷。 这些陷阱并不是一开始就很明显的,特别是如果您不熟悉编程的话。 MassiveViewController ViewController的基本问题之一是,随着应用程序开发的进行,它们会迅速变得庞大而笨拙。 这可能会导致多个问题。 首先,从实际的角度来看,要使用包含许多应用程序功能的不同部分的大型类可能会很困难。 由于可以广泛地解释ViewControllers的用途,因此很容易将似乎不适合其他地方的代码放入其中。 这可能导致MVC综合征-Massive-View-Controller。 ViewController的问题可能像Singletons一样,因为它们的用途是可以解释的,因此任何东西都可能属于它们。 抢救ViewModels? 大多数人试图克服MVC综合征时首先看的地方之一就是ViewModels 。 那么为何不? 这是一种向应用程序添加另一层抽象的方法,这正是我们想要的,对吗? 好的,这绝对是朝正确方向迈出的一步。 ViewModel是视图显示逻辑的抽象。 抽象之所以好,是因为它们使应用程序的不同区域分离。 抽象化应用程序功能的不同方面是我们如何整理代码的方式。 答案的一部分-不是解决方案 虽然ViewModels不是解决我们难题的灵丹妙药,但是它们也会出现问题。 首先,要隐藏在ViewModel的ViewController中填充的所有代码将变得非常容易,从而创建一个全新的综合症:Massive-View-Models。 发生这种情况时,我们的ViewController看起来很漂亮,但脏的秘密隐藏在ViewModel中。 使用ViewModels可以解决的只是一部分难题,它们的实用程序不应该被打折,而不能打折。 隐藏混乱不是我们要在这里努力的方向,我们想要的是模块化。 […]
在开发iOS应用程序时,模拟器是开发人员的最好朋友。 这是在开发过程中测试应用程序的快速简便的方法,因为我们可以使用GUI与iOS模拟器进行交互。 苹果公司关于模拟器入门的文档很棒,我们几乎可以通过使用图形用户界面来学习有关控制模拟器的所有知识。 尽管模拟器很容易与GUI一起使用,但是脚本模拟器交互要在Continuous Integration服务器上运行有点痛苦。 幸运的是,Apple有一个不错的命令行实用程序,名为“ simctl”。 在本文中,让我们看看如何使用’simctl’与iOS模拟器进行交互。 我们将介绍以下内容 创建,删除和引导模拟器 将照片和视频添加到模拟器 在模拟器中安装/卸载,启动/终止应用程序 捕获截图并录制模拟器视频 收集模拟器日志和其他技巧 simctl Apple具有“ simctl”二进制文件,可从命令行与iOS模拟器进行交互。 它与Android的adb非常相似。 再次,这是Apple记录不足的另一个实用程序,但是我们可以在/Applications/Xcode.app/Contents/Developer/usr/bin/simctl中找到二进制文件,并将其与xcrun实用程序一起使用。 我们可以使用help命令访问所有可用选项 $ xcrun simctl帮助 我们可以使用’simctl’在iOS模拟器上执行各种操作,包括创建新模拟器,擦除模拟器,在模拟器内部安装应用,向模拟器添加照片/视频等等。 让我们详细研究其中的几个。 列出所有可用的模拟器 我们可以使用命令轻松列出所有可用的模拟器 $ xcrun simctl列表 该命令将列出运行时所有可用的模拟器。 如果已经在运行,它还将显示“已启动”模拟器。 在模拟器上的CRUD操作 我们可以使用simctl创建,擦除,删除,引导,关闭和升级模拟器。 创建 我们可以使用命令在现有的iPhone7(iOS 10.3)模拟器之上轻松创建名为“ My-iPhone7”的新模拟器。 $ xcrun simctl创建My-iphone7 com.apple.CoreSimulator.SimDeviceType.iPhone-7 com.apple.CoreSimulator.SimRuntime.iOS-10-3 我们可以看到使用列表选项新创建的模拟器,并且拥有模拟器’C86A559A-1F50–40D1–8D84–954EDFBBCE18’的UUID 关机/擦除/启动 正如我们已经看到的那样,已经启动了另一个模拟器,让我们关闭它并擦除其内容。 这里的顺序很重要,我们不能在引导状态下擦除模拟器,我们需要先关闭然后再擦除。 $ xcrun simctl关闭C8C050F3–062D-4444-A888-BBEC783E31BD $ xcrun simctl擦除C8C050F3–062D-4444-A888-BBEC783E31BD 开机 现在,让我们使用新的UUID引导新创建的模拟器 […]
早安,好久不见!神隐成阵子也该出来透透气,2018年6 / 4–6 / 8参与了在美国圣何塞,加利福尼亚的苹果开发者朝圣大会,相对于其他活动我认为这个是比较因此写下此篇文章的心得顺便记录一下,一并附上我参考受用的文章连结:BožidarŠevo(英语),forbze(英语),OneV的巢穴(中文)。 首先说明取得门票必须拥有开发者帐号,这对你们应该应该不陌生,请自行Google,由于参加者众但门票有限,使用这种一般途径是需要经过抽签的(古董的前1-2个月)登记,可在官网查询),另外的途径例如如与苹果合作企业,奖学金资格,苹果员工等门票入手方法比较特别,说明一下学术好了,通常是学生申请,并且另外附上当年度“小”作业,也许如用Swift Playground做一个酷炫的App,有时候这样的一个小专案反而需要更多创意与收益,当然如果以这样的方式得到门票,肯定是意义非凡。偷偷推广一下我的App(不是Scholarship… ),下载全部以继续阅读(可…可恶没这功能)。 EZCircle圆订,EZ汇率,猜歌Quiz WWDC官网当年度的活动资讯通常都到很接近古代日期才会释出,这颗白苹果隐藏了许多不可告人的秘密吧,由于注册抽签时一定要绑扎付款方式(通常是信用卡),当收据到信表示已中签时就会被立刻扣款,也就是$ 1,599 USD,你没看错!就是那么贵而且这是Non-refundable意即不可退还,在政策上都有说明,所以目前看起来最好的旅行方式是请公司老板赞助……也可以带公司App去健检一下,你可以在Apple Developer的Event中找到你的电子票,距离剩下一个礼拜时Apple会更新官方App,登陆自己的Apple id后就可以将电子票加入Wallet,报到时出示条码就可以换Badge了,因此如果你只是担心与会票券,不用怕,带着你的iPhone去会场就可以啰! 连续两年的会场都在San Jose圣荷西的McEnery会议中心,天气穿着等就不在于了wiki上应有尽有,基本上就是风大时还是会凉的那种天气,去美国前记得申请ESTA,建议到达时间设在报到的大前天或者前一天早上,而报到时间是在会议开始的前一天,如果从台湾出发由于没有直飞圣荷西机场的飞机,因此会飞到San Francisco机场再搭BART捷运过去(悠游卡的名字叫做Clipper Card),我现在认为开车其实是最好的选择,在美国开车路大很好开,尤其是会场附近的大众运输并没有我预想中的方便,结果最后没乘车的我就是搭UBER到达,虽然方便但相对的烧钱,又没办法自由自在的去附近的矽谷穿梭,史丹佛漫游,强烈建议租个车子。 讲是吃的东西吧!毕竟是超高级科技园区,餐厅价格也是不同凡响,如果你有点击烹饪煮技能的话可以省下不少钱,基本上我分开三类,$ 13 USD以下,$ 13〜$ 20区间,$ 20以上,对于台湾人消费看含税价格习惯后,去美国不习惯的一点就是Tax&Tips,价格显示都是未税价,先说Tax像是我在SF买的纪念品价格是$ 13.99,下面的$ 1.19就是税(1.19 / 13.99 => 8.5%),提示则是在餐厅布置看情况给,有服务生到餐桌上菜整理时,就需要给小费(定价为价格的10%通用,但看你心情,服务越好越多,服务生对这个小费有所期待…,多多益善但也可以不给,但是后果请自负=口=),比较好区分的需不需要的方式是如果你是餐前付款(例如:速食餐厅,外带,自助取餐)就不用,现金也不用带太多在身上($ 100以下)一卡在手,希望无穷(帐单寄给老板就对了^ O ^),信用卡在矽谷首都90%以上 的消费完全刷,但就是用台湾信用卡会有一点国外交易手续费就是了。 好像突然离开发者有点远了,咳嗽,赶快拉回来要不然有人以为我是去玩的((误,我个人hen边缘所以很多开发者的点没有达到,有个不错的Tips供参考, ii。预约实验室跟Apple官方开发者互动iii。不要错过一些除了session外的活动(我绝对不会说我错过了什么),会议就是针对未来一年的开发布局简报,Lab是咨询时间主题官方订问题由你决定,有些要先在当天早上安排,所有一般的会议在网第一天的主题演讲要超早起排队(想要坐在前面的凌晨3–4点开始排,中间位置的5–6点开始排),但十点钟才开始简报且九点快十点才入座,大半时间就是无聊的排队,6000只叫做工程师的生物从世界各地飞过来 总之就是试图做到一些平常无法做到的事情,跟一些排队前后的其他国家的人聊聊他们的App,每个人都很有想法,也会偷听其他人在聊些啥,顺便练练习听力,除非真的是工作需要,否则在这个会议期间窝在角落写Code我认为相当不值得。 最后最后,我要感谢台湾FB WWDC2018拉我进FB群(不要问我是哪一个,最帅的那一个就是了)才能有更多大神前辈的资讯,如果明年你想要找我当导游的话,赞助我旅费我非常愿意提供一套用于U,哈哈,想要其他资讯的人也欢迎利用留言或我的个人软件包App上的联络资讯XD,必须先下载我才承认; )欢迎转载,但请注明出处与连结,预祝各位旅途愉快,收获满满。
这是WWDC 2017演讲的简短表格摘要,仅重点说明要点和关键示例: UIKit应用程序中面向协议和价值的编程– WWDC 2016 –视频– Apple Developer 在去年的面向协议的编程和具有值类型的会议上构建更好的应用程序的基础上,今年的…… developer.apple.com 您可以从WWDC视频中下载完整的示例代码: https://developer.apple.com/library/content/LucidDreams/Introduction/Intro.html#//apple_ref/doc/uid/TP40017334 本地推理-关于功能的独立思考。 您不必了解应用程序的整个上下文即可维护各个功能。 您应该只能够应用局部推理来理解各个功能。 MVC:模型存储您的数据。 视图将显示它。 控制器在两者之间进行协调。 使用Structs之类的Value类型与Classs之类的引用类型相比,可以促进局部推理,简化关系,并使代码更具可测试性。 结构在其所有成员上赋予值语义和独立存储。 在模型层中使用值类型是标准且无争议的。 但是,一旦您开始在其他地方(例如控制器)使用值类型,人们通常会犹豫不决,或者不知道该怎么做。 例如,子类化一个tableview单元是有限的,因为您不能在不是单元格的其他视图中重用该代码。 代替使用UITableViewCell子类,我们可以将其更改为结构并实现layout(in rect:CGRect)方法: 然后,我们更新单元格子类以在上述布局结构中调用图形调用。 现在,我们还可以从其他区域调用此绘图代码,而不仅仅是表格视图单元格: 通过为布局代码提供样本以进行内部布局,然后验证生成的框架,也可以更轻松地对布局代码进行单元测试。 我们不必考虑该视图使用或替代的其他特定视图功能。 现在,我们可以更改布局对象以使用协议,而不是引用UIViews。 这样我们就可以将布局逻辑也应用于其他类型的对象(例如Sprite Kit对象),而不仅仅是UIView子类。 下面我们还使用“ Retroactive Modeling”使UIView和SKNode都符合我们的布局协议: 协议是通过继承实现多态性的绝佳解决方案,因为您可以将相同的额外行为应用于任何不相关的类型。 当前,“内容”和“装饰”都可以是任何类型的对象,并且它们不必是同一类型。 如果我们想将两个约束为相同类型,可以使用泛型通过在结构上指定所需的类型来实现。 (现在,内容和装饰都必须与传入的Child类型相同): 使用泛型还可以为编译器提供有关代码正在执行的操作的更多信息,并允许我们进一步优化代码以提高性能。 继承牺牲了“局部推理”,因为您必须考虑父类在做什么,它如何工作,将要更改或覆盖的内容以及如何使其与父行为一起工作。 如果要继承系统对象,那么这些对象也将非常复杂。 它使您的思维在父母和班级之间跳来跳去,系统变得更难以理解。 合成意味着将许多较小的片段组合在一起,以制成较大的片段。 类很昂贵,会导致堆分配。 使用类来构成视图非常浪费。 结构更便宜,并且具有有价值的语义(因此具有更好的封装性)。 没有人可以修改您的副本。 您可以使用以下结构为不同的布局类编写视图组成代码: 但是,仍然存在更好的方法,只需简单地使布局结构也符合布局协议即可。 (从它们两个中都删除冗余方法布局): 现在,我们的视图和布局都使用相同的Layout方法,将自己定位在给定的rect中是他们的责任。 合成使我们能够以声明的方式构建高级布局: 如果我们希望布局以正确的顺序相互嵌入视图(层叠),则每个布局都需要以正确的顺序将其子级返回给其所有者。 因此,我们可以在内容上实现get方法,并让每个实现者返回其所有视图。 […]
注意:这是我在XCblog上的原始博客文章的转发 。 Xcode附带了许多命令行工具,您可以在以下路径找到它们 /Applications/Xcode.app/Contents/Developer/usr/bin 每个人都有特定的目的,但其中一些对于iOS开发人员的日常角色非常重要。 大多数iOS开发人员喜欢通过Xcode或使用第三方GUI工具来完成GUI的所有操作,但是经验丰富且经验丰富的开发人员会使用诸如boss之类的命令行工具。 每个iOS开发人员都应该知道一些有用的工具,并且其中几乎没有以“ XC”为前缀的工具。 在这篇文章中,让我们浏览其中的五个。 xcodebuild xcodebuild命令是iOS开发中所有命令的父级。 您可以使用“ xcodebuild”命令执行大多数iOS开发人员任务,例如清理,分析,构建,测试,存档,但是您需要将很多选项传递给“ xcodebuild”才能完成正确的事情。 您可以使用手册页浏览这些选项 $ man xcodebuild 或者,您可以在此处的网页中找到所有这些有用的信息。 我们可以使用xcodebuild来构建,测试和归档我们的项目目标或方案。 “ xcodebuild”的示例为 > xcodebuild测试-project MyAppProject.xcodeproj -scheme MyApp -destination’platform = OS X,arch = x86_64′ -destination’platform = Simulator,name = iPhone,OS = 10.2′ “ xcodebuild”是一个巨大的命令,掌握它会花费很多时间,但是一旦知道了它,就可以编写与iOS开发相关的任何脚本。 Xcode选择 Xcode具有活动的开发人员目录,通常位于/Applications/Xcode.app/Contents/Developer/或我们可以使用环境DEVELOPER_DIR进行设置。 命令xcode-select用于管理Xcode的活动开发人员目录,以便我们可以同时管理两个版本的Xcode。 我们可以在Xcode版本之间切换,例如我们想使用Xcode beta $ sudo xcode-select —切换/Applications/Xcode-beta.app/ 我们也可以使用’xcode-select’通过命令使用GUI交互来安装Xcode命令行工具 $ xcode-select-安装 xcrun […]
苹果专业应用商店 2005年的音乐工作室和无与伦比的逻辑音乐工作室,以及在洛杉矶DJ演出的音乐工作室。 Provides Pro pro de lacompañíaAvid的专业生产工作室。 专业证书的原声带的最终证明。 从逻辑上说,“专业”是没有专业资格的。 Hoy endíaLogic Pro es de dodos los DAW(数字音频工作站)sin duda el de mejordesempeño,Mac OS上最方便的应用商店,es App es de es gracias al recorte de costos deproduccióny de分发100%无形产品。 专家级的专业模型工具,包括Adobe的创意云,以及实际操作的额外费用。 En los estudios独立软件开发公司提供的软件支持,debido a los pocos recursos con los que se cuenta y con unos ingresos en algunos casos no estables […]
Swift是一种非常容易学习的编程语言,因为其语法易于遵循。 在本iOS Swift教程中,我们将介绍一些Swift语言基础知识,并且我们将了解使用Swift编程语言进行开发的过程是多么容易。 在开始构建iOS应用之前,我们需要了解Swift语言的基础知识,并了解它们如何协同工作,然后才能构建所需的出色应用。 在本教程和所有后续教程中,我们将使用Swift 3。 定义变量 变量用于存储值,以后可以在程序中对其进行操作。 首先,让我们创建一个新的游乐场并保存。 然后清除所有游乐场内容。 要定义变量,请使用关键字var,后跟变量名称,如下所示: var myvar 您可以为变量使用任何名称,但不能以类似以下的数字开头变量名称: var 2myvar 上面的定义是不正确的,但是您可以包含如下数字: var myvar2 使用所需的任何变量名,但要具有描述性。 要为该变量分配值,请使用等号,如下所示: var myvar =“您好,LikeGeeks访问者,欢迎使用iOS Swift教程” 字符串插值 要打印字符串并包括其他类型的值,可以使用字符串插值\()进行如下转换: var var1 = 100 var var2 =“您好,我口袋里有$ \(var1)” var var2 =“你好,我口袋里有$ \(var1)” 您不仅限于字符串变量,还可以在Swift中定义不同类型的变量。 var var1 = true var var2 = 50 第一个变量var1是布尔类型。 您可以对布尔类型使用true或false。 第二个变量var2是整数类型,或者用Swift语言命名为Int。 在Swift中,您不需要键入变量类型,而该类型则是类型推断 。 Xcode根据提供的值检测变量类型,因此,如果在引号之间为变量分配值,则表示变量是字符串,如果键入整数作为值,则表示变量类型为Int等, 您可以像这样显式定义变量类型: […]
Objective-C由Brad Cox和Tom Love于1984年创建,是C的扩展。它在C语言中添加了SmallTalk样式消息传递和对象定向。 Objective-C的比较优势: 与C ++和Objective C ++的互操作性 动态功能,例如方法混乱 更好地支持编写二进制框架。 Objective-C的缺点: 由于Objective-C建立在C之上,因此缺少命名空间 。 Objective-C应用程序中的所有类都应该是全局唯一的。 因此,为了避免冲突,有一个在类名前加前缀的约定。 这就是为什么我们在Foundation Framework中为类提供了‘NS’前缀,在UIKit中为类提供了‘UI’前缀。 显式指针。 在nil对象上发送消息而不会崩溃的能力以及缺乏严格的键入导致了难以跟踪和修复的错误。 该语言在语法上冗长而复杂,但是鉴于它是一种相当古老的语言,因此可以预期。 Swift是一种于2014年发布的年轻语言。它采用现代语法和功能,旨在确保安全性和高性能。 Swift于2015年12月开源。 Swift的比较优势: 由于使用静态类型以及使用可选对象和可选链接,因此Swift更安全。 支持名称空间,清晰的可变性语法,功能模式和简洁的语法。 使用Playgrounds进行交互式开发。 对于新程序员来说,Swift更容易学习。Apple的官方语言指南是一个很好的资源。 Swift表现出色,正在服务器端应用程序中找到自己的位置。 克里斯·贝利 ( Chris Bailey)在Realm Academy上的一次演讲中解释了在服务器端使用Swift的优势,他指出了Swift与服务器和云上其他框架相比的优势。 据他介绍,Swift性能卓越,内存占用量低,这使其成为服务器端开发的理想选择。 Swift现已稳定,其ABI已锁定。 Swift标准库代码包含约42.5%的Swift代码。 标准库中使用的不同语言的拆分如下图所示。 此Swift代码可能是开发人员可以用来改进自己的Swift编码的最佳Swift代码。 在本演讲中,它涵盖得很好。 Swift的比较缺点: 编译时间更长。 没有直接使用C ++库的方法。 模块格式的稳定性仍未实现,对于希望将其代码共享为二进制框架的开发人员而言,这是必需的。 结论 Swift现已正式成为ABI的稳定用户,可以被认为是一种成熟的语言。 Swift中的未来更新不会破坏从现在开始在Swift 5中编写的当前代码。 苹果提供了Objective-C和Swift之间的出色互操作性,并且不会在不久的将来放弃对Objective-C的支持。 对于团队来说,最好将其Objective-C代码的一部分迁移到Swift,因为它现在是ABI Stable。 如果您正在开发一个二进制框架,我建议您等待Swift实现模块格式稳定性。 另外,如果您要使用C ++和Objective-C ++代码库或框架,那么您将需要使用Objective-C和Swift。 […]