应用数据流:第一部分

与商店合作

  示范代码 

在我们陈述之前,如果您在标题中看到商店,并认为这与商务应用程序有关,那么不幸的是,事实并非如此。 在这种情况下,Store是针对组织用于应用程序的数据的存储和检索的特定方式。

好的,既然我们已经解决了这个问题,那么今天我们将要讨论应用程序数据流。 虽然这个主题听起来可能并不超级有趣,但是从长远来看,很好地处理流经应用程序的信息流将为您节省大量时间。

乱序

在开始构建之前,您多久坐下来勾勒出一个应用程序的大致轮廓? 经常? 一点也不? 如果是定期的,那么有多少时间用于映射数据和应用程序状态,以及有多少时间在计划UI上?

事实是,花时间计划数据的人并不像在UI上那么多。 为什么不呢?有很多很棒的工具,例如Sketch,可以用来计划UI,还有很多博客和其他资源,可以用来学习更多有关计划UI的信息。 计划数据并不是乐趣的一半。 但是,如果您做得正确,花时间去做将为您节省两倍的麻烦。

组织混乱

如果您考虑一下,那么一开始没有太多经验并在iOS中使用MVC作为指导的人可能会以多种方式构造代码。 没有什么限制甚至路标可供他们遵循。 清晰可见的路标通常像救生筏一样被抓住。 这就是为什么这么多的初学者代码最终出现在ViewController中,尤其是viewDidLoad中的原因。 没有太多其他参考,这成为他们的组织原则。

开放的画布

除了基本UI类的实现之外,作为程序员,您几乎没有做出任何决定。 刚开始时,打开的画布通常是挫败感的源头,因为在那个阶段,您真的想知道应该去哪里。 但是,有了这个自由空间,您会感到更加舒适,这为您提供了一个探索的好地方。

MVC

对于此示例,我们将使用接近普通MVC的内容进行处理。 过去,我必须承认,我对iOS使用的标准MVC抱有不必要的苛刻意见。 主要是由于我自己的不耐烦。 只要有一点时间,加上适当的实现,MVC就能很好地工作。

尽管在演示项目中有视图模型,但是代码没有什么特别的花哨,没有RxSwift,也没有协调器。 出于所有目的和目的,它都是原始的MVC,因此tableview单元模型的结构如下:

数据流

在继续之前,我只想澄清一个术语:数据流。 当我指的是应用程序中的数据流时,我指的是如何将数据从源头传递到应用程序以进行显示以及其结构。 它涵盖了从API响应到数据模型乃至数据呈现的所有内容。

就其重要性而言,它并没有获得应有的价值。 我愿意打赌,当我第一次学习网络电话并开始构建更复杂的应用程序时,我经常会遇到很多麻烦,这是因为我并没有真正考虑数据将通过应用程序的方式。 希望它将变得更加清楚演示代码的重要性。

同步器

同步器是一个类绑定协议。 实施后,它将允许您的控制器预订正在更新数据模型的对象。 这样,它就可以采取相应的行动。 在我给出的示例中。 当数据模型添加新项目时,将通过其与Synchronizer的订阅来通知控制器。 然后,它可以同步数据和视图。

同步

同步维护控制器和更新数据的对象之间的连接。 当您认为数据已完成更新时,将发送同步消息。 这可能在API调用或CoreData提取的末尾。

商店

商店协调流程并保存数据。 在基本形式中,它只是定义某些特征的协议。 当您针对特定数据和任务实施它时,它将变得很有用。

物品商店

此类符合Store协议,并且专门用于处理应用程序主数据模型,我将其命名为Item。 ItemStore实现了Store功能以及一些专用代码。

TableViewDataSource

此实现中的TableViewDataSource作为数据源和视图模型有双重职责。 它充当数据与视图和控制器之间的中介。 如果我对此课程有保留,那就是它的起点接近具有多重目的的路线。 将数据和视图建模之间的接口分离为单独的类可能更好。 目标是在模型和控制器以及视图和模型之间建立清晰的分隔。 在第二部分中,您可能会看到此修订内容创建了清晰的分隔。

ViewController

最后,如果没有ViewController,这将是不完整的(也不会运行)。 在某种程度上,我们可以将逻辑排除在此类之外是最好的。 如果您发现控制器或API逻辑中发生了很多视图逻辑,则这很好地暗示了封装已损坏,并且其他对象尚未完全实现,并且这些类未遵循正确的封装。 在合理的范围内,尝试使物业不公开。 如果出于某种原因需要修改或访问该属性,请创建一个方法来简化该操作。 如果您的ViewController看不到某个属性,则开始使用该属性执行逻辑的可能性要小得多。

数据库

最后,我将数据存储部分附加到末尾。 这些是直接处理将数据存储和检索到磁盘的组件。 它们已被分解为作为数据库类中实现的协议的读写功能。

作家

读者

数据库:

在数据库类中,在使用符合Codeable的通用T的实现中,我们将DataWriter和DataReader协议结合在一起

资源

Swift中的单向数据流架构(Redux)
我非常喜欢使用Swift的可重用和干净的架构。 在上一个项目中,我实现了MVVM和协议… medium.com 博客·objc.io
objc.io出版有关iOS和OS X开发的高级技术和实践的书籍 www.objc.io GitHawk博客
适用于iOS的GitHub项目经理应用程序。 blog.githawk.com 可可与爱
即将发布的CwlViews库提供了用于构造视图的语法,该语法对Cocoa产生了深远的影响 。www.cocoawithlove.com