Tag: 通用

使用Swift在iOS中构建通用框架

我已经搜索了很多可靠的资源,这将有助于我在iOS上构建自定义通用框架。 我尝试实现多种技术,但它们并没有帮助我完成任务。 寻求和阅读很多东西有助于我了解更多有关它的知识,最终我建立了一个通用框架。 我想分享我如何轻松构建此框架, 创建可可触摸框架: 打开Xcode, 文件→新建→项目 。 在iOS下,选择Framework&Library,然后选择Cocoa Touch Framework,然后单击“下一步”。 输入您的框架名称,然后单击“下一步” 。 然后选择您的项目位置并创建项目。 选择您的项目,选择目标→项目名称→选择构建设置选项卡。 在构建框架之前,始终将“启用位码”设置为“是” 。 在项目中构建所需的功能。 如果需要,您可以维护多个情节提要。 Framework项目看起来像一个普通的SPA项目,唯一的区别是您只能编译/构建Framework,而实际上不能在同一项目中运行它们。 如果项目仅在“ Simulator”中构建,则它将生成使框架专门在模拟器而非设备上运行的体系结构。 或者,如果项目是在“设备”中构建的,则它将生成使框架仅在设备上运行的体系结构。 因此,在“ Simulator”和“ Device”上都构建项目。 该框架将在“ 产品”文件夹中生成。 该框架将在项目的产品目录中生成,该产品目录具有两个单独的独特框架文件夹,这些文件夹将分别在Simulator和Device上运行。 设备框架:它包含仅为物理设备构建的体系结构。 模拟器框架:它包含仅为模拟器构建的体系结构。 从开发人员的角度来看,开发人员希望获得一个同时在模拟器和Device上运行的通用框架 。 大多数“流行”框架都是作为通用框架构建的,例如Mixpanel,Fabric等, 我写了一个“运行脚本”来生成通用框架。 选择项目目标→编辑模式→归档→后操作→按“ +”→“新建运行脚本操作” 。 UNIVERSAL_OUTPUTFOLDER = $ {BUILD_DIR} / $ {CONFIGURATION}-通用 #确保输出目录存在 mkdir -p“ $ {UNIVERSAL_OUTPUTFOLDER}” #接下来,计算出我们是否在SIM卡或DEVICE中 xcodebuild -target“ $ {PROJECT_NAME}”-配置$ […]

带流量控制器的MVVM —第一步

我正在观看有关MVVM概念的KrzysztofZabłocki的视频,并认为只有一种方法可以理解某些内容:创建我的项目! 在深入了解应用程序体系结构之后,最近6个月我一直在研究带有MVVM协议的模型。 要了解其起源,必须引用Natasha The Robot的文章以及有关面向编程协议的所有知识。 如果您不知道我在说什么,那么好的主意是阅读Natasha The Robot 。 一个月前,我最终观看了Steve“ Scotty” Scott的MVVM-C讲座。 在我今年看过的最好的视频之一中,重要的防御不是缩写技术,而是架构可以帮助我们改进软件的。 对于捍卫技术“银弹”的人们,我没有什么反对的态度,但是我更喜欢这样一种策略:从每个创意中汲取最大的价值,以找到最佳的解决方案。 Flow的初始化程序将构建ViewModel和Model(如果需要,还可以创建更多模型)和start方法,并创建必要的接口并注入其依赖项。 这将使这些实体之间的耦合更多地利用代码。 我们可以看到在OwlsFlowController的情况下,通过配置选择是将数据显示为Grid还是List,在这种情况下,它是固定的,但它可能是测试简单的A / B。 此模型的优点是,大多数列表中的应用程序共享相同的行为和相同的接口基础结构。 在这种情况下,只有数据和单元格会更改,并且可以作为参数传递并为所有列表创建重用代码库。 这里一个有趣的想法是实现了两种响应协议:一种用于Grid,一种用于List。 但是两者的实现是相同的。 这很有趣,因为我对每种类型的接口都有单独的操作,但是可以共享常用操作。 并且不使用继承。 界面的实现清晰明了,它是一种客观的基础结构,具有简单的参数即可显示。 所有创建都被删除,使他没有任何业务实现。 另一件事是通过Closure填充了单元格,这将使我们能够在不久的将来传递使用哪个手机作为参数。 这种体系结构的思想是将接口分为两部分,第一部分是一系列现成的基础架构,可在整个项目中重用。 第二部分是针对每种情况和每种数据集定制的UIView和单元格。 因此,我们的大部分界面都已包含在通用测试中,从而提高了安全性。 PS:由于某些原因,在某些情况下,Swift不会接受Generic类型作为init方法的协议参数。 仍在调查Swift Bug或故意限制。 结果是非常干净的代码,并最大程度地重用了接口。 并探讨了泛型和协议作为抽象问题的一种方法。 其他结果是构建时间明显快得多。 这些是几周后的初步结果,我希望获得其他结果,并将在其他文章中进行探讨。 如果他们想继续关注Github,请尝试在“ Middle”(此处)或“ Medium”(此处)的此处进行很好的记录,我将把这些文章。 接下来的步骤,谢谢。 下一步 测试:带有模拟对象的单元测试和UITest(MVVM和测试) 展开模型:其他对象(我需要找到其他动物) 接口的基础结构:创建其他单元格类型并使用相同的UIViewController 我的下一篇文章将介绍如何构建有效且易于维护的测试。 为我交叉手指。 特别感谢 引用时,我试图标记所有阅读的内容,以写出这段代码,对不起,如果我忘记了别人。 我不能忘记感谢Mikail Freitas帮助我识别了通用协议的初始化错误。 我们永远不会理解为什么在一种情况下有效而另一种无效。 PS:Claire Knight(Twiter),她将项目迁移到Swift […]

开源故事:从缓存中的可缓存到通用存储

目录 快取 可携带 异步 JSON格式 Swift 4中的可编码 责任链 什么是TypeWrapper? StorageAware协议 同步与异步 但是图像不符合Codable 解决 怎么样? 数据可转换怎么样? 数据生产者呢? 通用存储 转换类型 存储感知 变压器 转换功能 从这往哪儿走 我们从事开源已有一段时间了,您可能已经在GitHub上遇到了我们的一些工作或阅读了一些故事。 我们并没有尝试重新发明轮子,但是有许多我们需要专门用于工作流的组件,或者需要针对正在构建的应用程序进行自定义的组件。 因此,我们构建了许多框架和应用程序。 当我们在生产应用程序中使用它们时,我们认为与世界分享它们可能是一个好主意。 这是双赢的局面,因为我们回馈了社区,同时获得了很多反馈和建议。 作为一个小型的iOS团队,全职进行客户项目,同时尝试腾出一些空闲时间来从事开源工作是非常具有挑战性的。 开源就是建立抽象。 通过分离职责并创建可重用的框架,我们可以充分了解Swift的知识,并掌握有关正在使用的API的一些精妙的细节。 但是我们从未告诉过我们如何做事。 因此,将会有一系列我们的开源故事,详细介绍我们工作背后的技术方面,只要有开源经验即可。 首先,让我们谈谈缓存,一种持久化对象的框架。 在这里,我们将学习如何开发API以支持Swift语言和iOS,tvOS平台的新功能,同时确保它们足够灵活和可维护。 缓存并没有声称在该区域是唯一的,但是它并不是另一个为您提供神力的怪物库。 除了缓存,它什么也没做,但它做得很好。 它提供了良好的公共API,具有现成的实现方式和巨大的自定义可能性 在iOS平台上可以有许多用于缓存的解决方案,例如SQLite,CoreData或Realm或其他第三库。 我们想要从Cache中获得的是一种简单的方法,可以将一些JSON数据存储到磁盘,到期管理和我们熟悉的API。 从用户的角度来看,我想使用键可靠地保存和加载对象,并具有同步或异步执行此操作的能力。 这是我们旨在实现的API。 在第一个版本中,由于对象应该被序列化并反序列化为用于磁盘存储的Data ,因此我们引入了Cachable协议。 我们还使大多数原始类型都符合Cachable,因此用户不必自己执行此操作。 对于内存存储,我们在NSCache使用NSCache ,因此对象将按原样保存。 缓存基于具有前缓存和后缓存的概念。 对前端缓存的请求应减少时间和内存消耗(此处默认使用NSCache )。 正面和背面缓存之间的区别在于,背面缓存用于超出应用程序生命周期的内容。 看到它更像是一种方便的方法,用于存储应在应用程序启动期间持续存在的用户信息。 磁盘缓存是这里最可靠的选择 HybridCache具有具有Cachable类型约束的泛型函数,因此对于所有Cachable一致性它都是类型安全的 甚至对于自定义类型和UIImage 异步 […]