从CloudKit下载视频非常简单,但是我需要查看多个资源并弄清楚如何修复几个错误才能使所有这些工作正常进行。 本教程假定您具有CloudKit知识和使用documentDirectory的知识。 如果您不熟悉CloudKit,请查看此Ray Wenderlich教程。 这就是我用来学习基础知识的东西。 我们将在本教程中做什么 有一系列我们要下载的视频名称。 检查是否有任何下载 创建一个查询,该查询将发送未下载的视频数组 查询Cloudkit以查找我们需要的记录 下载视频并将其存储在文档中 我假设您已经知道如何设置CloudKit并上传了视频。 步骤1:设定 这是我将在本教程中使用的视频名称的数组。 您将需要更改项目以匹配您在CloudKit中存储的名称。 在您的ViewController中: 让arrayOfVideoNames = [“ Apple”,“ Banana”,“ Cantalope”] 步骤2:获取文档目录的内容 创建一个新文件。 该文件将包含一个名为DocumentsDirectoryFunctions的结构,该结构将具有与documentsDirectory相关的所有功能。 此结构的主要目的是获取documentDirectory的内容,以便我们可以将其与arrayOfVideoNames进行比较。 fileManager和getDocumentsDirectoryPath被标记为私有,因为我们不需要在结构外部使用它们。 如果需要,只需删除“私有”即可。 struct DocumentsDirectoryFunctions { 私人让fileManager = FileManager.default 私有函数getDocumentsDirectoryPath()->字符串{ 让directoryPaths = fileManager.urls(用于:.documentDirectory,在:.userDomainMask中) 让docsDirectory = directoryPaths [0] .path 返回docsDirectory } func getContentsOfDocumentsDirectory()-> [String] { var tempArray:[字串] = [] 做{ 让filelist […]
介绍 自2014年首次面世以来,Swift取得了长足的发展。如今,大多数时候,您可以完全使用Swift编写应用程序。 但是,有时您会在Swift和Objective-C之间来回切换。 一个示例是使用NSAttributedString 。 这似乎很明显,无需担心。 但是,如果使用不当,可能会导致性能显着下降。 本文概述了在Swift和Objective-C之间桥接时发生的情况,并探讨了可能导致性能问题的一些潜在热点。 背景 导入Foundation ,您可以访问Objective-C开发人员使用了数十年的广泛的Objective-C类(带有NS前缀)。 其中许多类的行为(几乎)与等效的Swift构造相同。 例如, String与NSString ,以及Array与NSArray 。 Swift和Objective-C是两种独立的语言,它们的实现,编译功能和运行时功能都非常不同。 他们如何相互理解,以及如何在这两种运行时表示形式之间进行转换? 通过所谓的桥接 。 尽管苹果公司已经尽可能快地优化了桥接,但是它从来都不是免费的。 在两种语言之间架桥时总要付出代价。 图1描述了两种语言之间的桥接时桥接的工作方式,我们分散设置了新的存储。 如果我们用一种语言处理很多事情,那么我们将用另一种语言处理很多事情。 我们必须逐个元素地进行转换。 这种逐元素桥接有时是递归的。 例如,如果我们有一个整数数组,则首先桥接该数组,然后桥接该数组中的每个单个整数。 识别桥接问题 桥接的常见示例是使用属性字符串时。 假设我们要实现一个自动完成的搜索文本视图,该视图允许用户键入一些文本以获取以用户键入的搜索词开头的建议列表。 建议将以粗体显示匹配的部分。 例如,如果用户输入“ ar ”,他们将看到一个弹出窗口,显示: 阿根廷 亚美尼亚 阿鲁巴 样式化属性字符串的实现如下所示: 起初看起来很正常。 但是,让我们仔细看一下上面的代码片段。 首先,我们从给定的String类型的String创建一个NSMutableAttributedString 。 其次,我们使用属性字符串中的string属性,并询问要修饰的字符串的范围。 这可以确保它在目标字符串的范围内。 该请求返回Swift Range类型的值。 第三,我们将上述步骤的结果转换为NSRange因为可变字符串仅适用于NSRange 。 注意,在此步骤中,我们再次从属性字符串中调用string属性。 最后,我们将font属性添加到目标属性字符串中,该属性具有从上一步计算出的给定范围。 每次我们调用attributedString.string ,实际上是在跨语言桥接字符串。 我们从Swift执行上下文开始。 但是, NSMutableAttributedString的实现在Objective-C中。 […]
首先,我不会理解为什么面向协议的编程要比继承等更好。 有很多有关该主题的材料,因此您可以发表自己的看法。 我只想与您分享一些我在学习过程中学到的好东西。 我目前正在将我的Objective-C库WANetworkRouting重写为Swift。 顺便说一句,我们在Wasappli的许多应用程序中都使用了该库,您应该尝试一下:通过一些配置行,您可以将应用程序连接到REST Web服务,并在几分钟内将数据缓存到CoreData。 我可能一直在说:我只是将我的代码翻译成Swift,但我想潜入该语言提供的新思维方式。 在过去的8年中,成为Objective-C开发人员使我的习惯变得异常激动。 在Swift中,我最喜欢的事情之一就是如何使用协议为类添加行为。 除了使用继承,您还可以摆脱任何层次结构并放宽行为堆栈。 您还可以精确地决定采用哪种行为,而不必在某个时候吃一堆意大利面。 这样做还鼓励您编写更可测试的代码👍 让我们深入研究代码:WANetworkRouting的功能之一就是能够执行GET myObject之类的功能,而无需知道API上的路由。 在OC库中,我有一个名为WANetworkRouter的组件(很明显),它注册WANetworkRoute,它具有一些属性,例如pathPattern (例如: pathPattern shelves/:itemID ), httpMethod ( POST , GET ,…)和对象类。 这主要是受RestKit和一种方便的配置方式(一劳永逸地配置所有库,以使内容分离)的启发。 例如,您可能正在编写此 然后,通过调用此方法,路由器将针对您的API构建路径。
这是有关ARKit的每周新闻,您可以在 WhatsUpARKit.com上 订阅 最近,我遇到了几个开发人员,他们致力于以下令人兴奋的AR应用程序。 与ARKit相关的初创公司不断向开发者发布Beta版邀请。 我们还将很快看到在带有iOS 12的AppStore上发布的新ARKit 2.0应用程序。 享受第九期 奥斯卡@osfalmer twitter.com 在Apple工作的David Lui(@lDavixl)表示,您现在可以通过嵌入usdz文件轻松地将AR内容集成到Apple文章中! 这是有关此文件的Apple文档。 manomotion.com ManoMotion是一家初创公司,致力于使用非常精确的手部跟踪来控制AR体验,包括ARKit。 他们最近向开发人员开放了Beta版,您可以在其网站上订阅她。 您还应该查看由日本开发人员@lileaLab制作的带有此链接的演示。 twitter.com Warren Moore @warrenm发现,ARKit Quick Look Gallery现在包含一个链接,用于下载包含独立USD(v18.09)库和驱动它们的Python脚本的软件包。 ZIP文件位于https://developer.apple.com/arkit/gallery/的底部 twitter.com Jacobo Koenig(@jacobokoenig)创建了一个概念,可以直接在剧院上映电影预览。 twitter.com Alberto Taiuti(@albtaiuti)和Jordan Campbell(@jordanNZ_AR)正在构建一个应用程序,可让您在当前所在的地图上放置所选的任何3D环境。 酷演示! twitter.com Cabbibo(@Cabbibo)创建了一个与AR和卡片互动的示例。 他/她还对其背后的XR反射做了完整的论述。 同样,您可以查看Cameron Horst的工作。 6天 6D.ai AR Cloud初创公司最近通过SceneKit&Swift支持更新了其Beta版,您可以在其网站6D.ai上进入Beta版。 twitter.com 最近发现了这个非常有趣的概念应用程序,在播放歌曲时可以在您的脸上产生惊人的效果。 这是开发人员的网站kitasenjudesign.com,并提供下载免费应用程序的链接-下载。 玫瑰色 Rosie通过冒险的难题和活跃的游戏向您的孩子介绍机器人技术和编程。 适用于iPhone的有趣且具有教育意义的AR应用程序。 在此处免费下载。 遇到了他们的开发者Florian Maushart @FloMaushart之一,强烈建议也跟随他! twitter.com Daniel(@ […]
每个应用程序都需要本地化,即使它是小型“单一语言”应用程序也是如此。 您永远不知道何时可以添加另一种语言。 即使您完全确定应用程序中将不再有其他语言,出于多种原因,也不应该在代码中直接编写字符串。 因此,您可以创建一些自定义枚举,常量,也可以使用标准的默认本地化键。 猜猜有什么更好的。 😏 本地化不仅涉及字符串,而且日期,数字或货币也必须根据用户的语言环境进行本地化和格式化。 由于它是由iOS本身处理的,因此现在让我们谈谈字符串本地化。 紧随其后的文本不是任何普遍真理,也不建议您应如何去做。 这就是我们做到的方式。 您可以使用它,从中获得启发,但是当然它不一定适合每个人。 让我们将其分为2个级别。 第一个是在应用程序中的代码级本地化。 第二个是非程序员对字符串的管理和翻译。 在应用程序本身中,一切都很好。 在最低级别上,我们使用标准.strings格式以及一些其他工具,以使其更加舒适和防错(如下所述)。 但是问题是如何创建Localizable.strings ? 程序员定义了本地化密钥,并且有人必须创建翻译。 您可以将所有Localizable.strings文件发送到翻译器,但是对于非程序员来说,这是一种非常令人困惑的格式,并且文件以某种方式返回损坏的可能性也很大(被遗忘的分号,引号等)。 对,这个问题早已解决。 创建了很多服务,尤其是用于翻译应用程序的服务。 可能最著名的是PhraseApp,但是还有Smartling,transifex等。 所有这些服务有2个共同点。 只是个过分杀手-我们发现我们真的不需要像PhraseApp这样的野兽。 帐户,历史记录,图表和其他功能。 这非常昂贵-当然,我们不会破产,但是为什么要为我们不需要的东西付钱呢? 在开始使用类似“ 短语应用替代 ”之类的内容之前,请尝试一下其他方法。 我们都知道电子表格…具有实时协作的Google Excel,但是您可能会惊讶于Google Spreadsheet如此强大! 您可以使用Apps Script进行出色的工作,它具有良好的Web API,并且还有许多用于各种编程环境的开源库。 我们甚至已经使用电子表格作为小型应用程序的后端,但这是另一篇文章的主题。 因此,如果它可以代替后端,那么它应该能够处理少量本地化字符串。 我们创建了一个新的电子表格,其中包含用于每个应用程序的本地化键和支持的语言的列。 由于命名约定的不同,每个平台的键可能会有所不同,这就是我们拥有更多键列(例如key_ios , key_android )的原因。 例如,基本表如下所示: + ==================================== + =========== == + ========== + | key_ios | […]
您的孩子还有另一个理由要您购买糖果和饼干,这一次是有充分理由的。 日本公司Glico以生产诸如Pocky等一堆受欢迎的小吃而闻名,它为孩子们提供了一种令人垂涎的方式来学习代码。 该公司已经推出了一个名为Glicode的新应用,该应用可以让您的孩子在玩饼干和糖果的同时学习编码。 要玩游戏,孩子们必须按照特定的顺序放置实际的饼干和小吃,以使角色在游戏中前进。 然后,他们必须拍摄一张照片,以将其转换为数字命令。 每种糖果都与动作有关,例如杏仁峰巧克力和饼干奶油沙,格力高公司的其他产品分别与“ if”和“ sequence”命令有关。 这个想法很像Apple即将推出的iPad应用程序Swift Playgrounds,在其中必须通过简单的编程任务来移动角色。 该应用程序当前仅在Android上可用,但该公司可能还附带iOS版本。 由于该品牌因其经典的Pocky而非常受欢迎,因此该游戏极有可能成为热门游戏。 尽管此应用程序是为儿童设计的,但您也可以尝试一下。 毕竟,任何人都可以玩自己的食物。
因此,在控制器之间进行自定义导航过渡是一件很酷的事情。 我决定尝试一下它,最终结果看起来很不错。 为什么不与他人分享。 这是每个使用iOS的人都一定会习惯的默认过渡。 我的想法是创造一些不同的东西。 我希望过渡可以并排进行,其中一个控制器将另一个推开,反之亦然。 最重要的是,所有ViewController都具有全局背景,以使它们从一个过渡到另一个,而不会看到控制器边界发生变化。 因此,要执行此方案,我们需要执行以下步骤: 制作一个自定义的导航控制器,它将监视所有交互; 制作一个自定义的动画器,以处理控制器帧的动画; 制作一个自定义的交互器,该交互器处理屏幕平移以允许交互的“弹出”过渡; 创建自定义的交互式背景; 我们从简单好开始-创建一个新的单视图项目。 创建一个UINavigationController子类和3个UIViewController子类。 所有这些都将不再需要,但它们可以帮助阐明观点。 有时。 Main.storyboard文件是通过以下方式设置的: UINavigationController,已设置为我们的自定义导航类(BaseNC)的子类,它与VC1具有RootViewController关系。 然后,VC1的“推”按钮与“ VC2”绑定在一起。 VC2至VC3相同。 最后,VC3具有一个与其控制器类关联的自定义操作,在该类中它执行popToRootViewController调用。 这里没什么特别的,只需设置即可。 设置完成,移至BaseNC类以开始设置。 持续时间,交互和句柄都可以修改和定制,以满足任何人的需求。 随时在这里签出该项目。 感谢您的阅读和愉快的编码。 — R 首先接收与移动开发相关的新故事。 —点击该跟随按钮 推特:@ ChiliLabs www.chi.lv
测试持久性功能对我来说是一个大麻烦。 每次我启动测试时,我的模拟器都充满了测试元素。 我的记忆上下文 基本上,您可以简单地删除测试创建的任何内容,但是有一种方法更容易。 您可以添加“ 内存持久存储” 。 顾名思义,这是一个“内存中”存储。 当应用程序终止时,一切都消失了。 基本核心数据资料 为了了解正在发生的事情,我希望您解释一些核心数据基础知识。 托管对象模型是您在Xcode中创建的模型。 它描述了数据结构的实体。 该模型仅描述您的数据结构如何,不包含任何数据。 因此,在我们的测试用例中,我们想测试我们的业务逻辑是否可以与数据模型一起很好地工作。 因此,我们必须使用与生产中相同的模型。 让managedObjectModel = NSManagedObjectModel.mergedModel(来自:[Bundle.main]) 持久性存储协调器的作用类似于“持久性存储”的包装,而在大多数应用程序中,您通常只有一个持久性存储。 商店协调员知道数据结构。 让persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel:模型) 持久存储是数据的“存储”逻辑。 CoreData默认使用SQLite。 但是在我们的情况下,我们要使用“ In-Memory ”。 这意味着在我们的测试用例中,存储协调器具有一个(内存中的)持久存储。 persistentStoreCoordinator.addPersistentStore(ofType:NSInMemoryStoreType,configurationName:nil,at:nil,选项:nil) 被管理对象上下文是我们与之交互的类。 它处理所有众所周知的CRUD方法(创建/读取/更新/删除) 。 由于它就像商店协调器上的立面一样,我们只需要使用包含内存中商店的商店协调器创建一个新实例。 让ManagedObjectContext = NSManagedObjectContext(concurrencyType:parallelType)managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator 如果您仍然有一些问题不清楚CoreData的工作原理,我强烈建议您观看Cocoacasts的这段视频: Cocoacasts解释了核心数据栈 让我们看一下代码 这是“临时”存储的完整代码。 我的应用程序“ PursCreate”中使用的完整代码。 开始了。 该方法只是创建了一个我们可以与之交互的新上下文。 关闭应用程序后,您存储的所有数据都将消失。 现在,您可以测试持久层,而无需添加模拟器。
今天我们将讨论抽象工厂模式。 它处理更复杂的用例。 众所周知,轿车家族拥有紧凑,中型和全尺寸的不同车型.SUV具有相同的类别。 假设我们有两个工厂。 一种侧重于紧凑型,另一种侧重于全尺寸。 如下图所示,工厂A生产紧凑型轿车和紧凑型SUV。 B厂生产全尺寸轿车和SUV。 让我们开始编码。 这是不同尺寸的轿车和越野车。 它们都符合各自的抽象接口。 protocol Sedan { func drive () } class CompactSedan : Sedan { func drive () { print (“drive a compact sedan”) } } class MidSizeSedan : Sedan { func drive () { print (“drive a mid-size sedan”) } } class FullSizeSedan : Sedan { func […]
让我们一起深入课堂 Shanu:嘿Aaina! 我在项目中经常使用类,但是我想知道它的实际工作原理,在哪里保存数据以及所有内容。 我:好的Shanu。 类是引用类型。 将引用类型分配给变量或常量,或将它们传递给函数时,不会复制引用类型。 而不是副本,而是使用对相同现有实例的引用。 引用类型实例在堆上分配,并且变量仅包含对内存中存储数据位置的引用。 因此,理想情况下,数据将存在于堆中,而引用指针将存储在堆栈中。 对于同一个实例可能有多个变量引用,这很普遍。 这些引用中的任何一个都可以用于操纵实例。 在复制类时,它将继续指向相同的引用指针,并将保留计数增加1。 沙奴:乌夫 ! 理论太多。 您能详细说明一下吗? Aaina:好的。 我们来看一个类片段,看看它是对象图。 指定的初始化程序必须始终委托。 便利的初始值设定项必须始终委托。 必需的初始化程序: 使用required关键字,我们可以指示每个子类都需要实现此初始化器。 必需的init(){} Shanu:很酷,很好的信息。 现在让我们讨论对象图。 我:好的。 如果在此对象图中看到引用指针是在堆栈上分配的,而值是在堆中分配的空间的。 Shanu:哇,棒极了! 有什么办法可以在xcode中查看对象的地址吗? 我:是的,肯定。 我们可以通过代码或使用lldb查找地址。