Tag: 持久性

Swift中的数据源…或如何避免这种新的时尚持久性框架决定了您应用的架构

该帖子最初发表在dcordero.me中。 在这里,您将始终找到更新的版本。 在iOS的世界中,确实有很好的框架来处理数据的持久性。 例如,Core Data是Apple提供的出色解决方案,即使在处理大量数据时也能提供令人难以置信的出色性能。 但是也有其他一些替代方法出现。 这些选择之一是Realm,据说它以更简单的语法提供比Core Data更好的性能。 但是可悲的是,在这个持久性世界中,没有什么能像预期的那样精彩。 还有很多问题。 我对Core Data,Realm或其中许多其他流行的持久性框架有非常不好的经验,这当然不仅是因为框架本身,还因为它们是如何应用于项目的。 主要问题在于,由于这些框架解决的问题非常复杂,因此它们倾向于具有相当复杂的语法。 而且,如果框架的范围没有明确定义,那么最终它们的对象往往会散布在整个项目中,找到从NSManagedObjects获取数据的UIView,使用RLMObjects填充单元的UICollectionViews等。 这种情况永远都不会发生,应用程序的持久性应该是非常内部的东西,应该隐藏在应用程序核心部分的最深层中,当然也不要与我们的UI层产生冲突。 最重要的部分是,将来替换掉所有这些代码部分以使用任何其他解决方案或框架应该非常容易。 这听起来像乌托邦,对吗? 但是……我们如何得到这个? 我们基本上只需要一个抽象解决方案,该解决方案定义一个接口来处理数据的持久性。 我的意思是使用数据源 。 注意:请不要将此数据源的概念与iOS用于填充某些TableViews,CollectionViews等的数据源混淆。 数据源 数据源从核心业务逻辑中提取持久性逻辑,并且无论框架的具体细节如何,都可以访问数据。 我们可以在Swift中使用非常简单的协议构建一个接口来管理数据源,该协议提供了完整的CRUD(创建读取更新删除)接口。 作为免责声明,我想在示例中保持简单,但是您是否听到了`BooksRealmDataSource`? 没有? 仿制药真的大声尖叫,不是吗? 🙃 储存库模式 现在,我们不必担心框架…想象一下让您的App的所有数据源实现先前协议的情况。 我的意思是,无论最终来自何处,总是以完全相同的方式访问信息。 磁盘,内存甚至网络。 它们全部来自完全相同的协议。 构建一个存储库 模式非常容易,该存储库 模式通过不同的数据源进行迭代可以从每种情况下从最快或更合适的源获取数据。 我们的存储库的实现再次要求泛型,只是收到泛型应管理的数据源列表以及适用于它们的策略。 例如,在上一个示例中,要获取我们的图书清单的存储库可能具有3个不同的数据源:内存,磁盘和网络。 具有首发比赛的策略。 但是用于进行用户登录的存储库将只有一个数据源(网络),以确保我们始终通过后端验证凭据。 最后,从应用程序的其余部分开始,这意味着无论数据来自何处,或内部使用了哪些框架,都使数据如魔术般神奇。 正是我们想要的数据。 就像我说的,最好的部分是,遵循这种模式,我们获得了巨大的模块化,并且我们可以在需要时很容易地更改内部实现。 您想尝试一下X新的流行框架吗? 好吧,只需更改您的一个数据源的实现,该应用程序的其余部分将完全不需要任何更改。

Swift4。缺少FileKit的额外便利。

所以这里是交易。 偶尔,我需要从iOS应用程序内部保留文件。 然后我去谷歌搜索。 前两个链接显示了我从中选择FileKit的最受赞赏的框架。 所以回到重点。 我们需要保留文件。 我们该怎么做? 嗯,看来FileKit有两种不错的类型可以帮助我们完成这项任务。 一个是Path ,另一个是File 。 每当您要保留文件时,都希望使您的类型符合以下两个协议: Readable和Writable 。 每个协议都需要实现与协议名称相关的方法。 但是这些特定的方法似乎过于全局,无法为我想保存到磁盘或从磁盘加载的每种类型的每次实现它们。 我们如何跳过这个无聊的 样板代码? 我们自己创建两个协议。 我们将其中一个称为Restorable ,另一个称为Persistable ,并将它们与FileKit中的相应协议兼容 。 现在我们像这样扩展它们。 现在,当我们有少数几个基本功能要在符合Persistable和Restorable的类型上执行时,这里的便利代码就消除了无聊的样板。 现在,只要您希望保留或恢复某种类型,就只需执行以下几步即可。 现在,您可以按以下方式随时将这种类型保存到磁盘或从那里加载。 干得好。 当然,这种方法在FileKit类型扩展方法中定义编码器和解码器有一些缺陷,但是请允许我和我随时调整这几行,并且可能永远不需要支持多个编码器 / 解码器 。 这是带有上面代码的pod repo的链接,例如 就是这个。 希望您喜欢这个方便的地方。 如果是这样,请鼓掌并订阅。

持久数据(Swift 4.1)

Apple提供了两种在应用程序启动之间保留数据的方法:Core Data和NSKeyedArchiver。 NSKeyedArchiver编码(保存)和解码(检索)您要持久保存的所有与NSCoding兼容的类。 尽管NSKeyedArchiver不如Core Data健壮(它速度较慢且手动),但它可以完成所需的持久化数据工作,并且不如Core Data复杂。 在Swift 4.1版本中, Apple通过遵循我们的自定义类型展示了一种最简单的数据编码和解码方式。 可编码-用于编码 可解码-用于解码 可编码-编码和解码 它也提供对class,struct和enum的支持。我发现Codable有两个很棒的Codable 。 制图 存档和取消存档 制图 假设您以JSON字符串的形式接收到响应(如果它是编码数据,则更好)。 使用该JSON字符串初始化我们的类型会很好,对吗? 让我们写下来: Swift 4.1在keyDecodingStrategy上具有一个新的keyDecodingStrategy属性,可以根据需要在snake_case和camelCase之间自动转换。 相反的属性keyEncodingStrategy ,也存在于JSONEncoder因此您可以将您的Swift camelCase名称转换回snake_case。 Swift 4.1通过keyDecodingStrategy改进了Codable Swift 4.0带来了许多很棒的新功能,包括多行字符串,更好的键路径以及许多改进的功能…… www.hackingwithswift.com 考虑我们的模型是否符合Codable ,如下所示: 快乐编码!