在Swift中编写网络层:库创建

在我目前的工作中,我们需要改进代码库,并且从网络层开始。 我们想创建一个开源库,但提出了一个问题:开源库的结构如何?

介绍

去年八月,我开始为一家名为Jumbo的新公司工作(我们仍然有很多职位空缺)来改善他们的移动应用程序,该应用程序在荷兰经常使用。 该应用程序已经并且仍然有一些改进点,因此该团队决定制定一个长期计划以提供新功能,同时改善代码库。

我们要解决的第一件事是网络层,因为该应用程序没有一个:每个UIViewController当前都在扩展一个基本控制器,这是唯一负责在子类中配置并管理所有请求的控制器。逻辑(是的,不理想)。

这是我们结构的一个例子:

这种结构没有错,但是它迫使您每次更改基类时都要测试每个控制器,并且由于验证逻辑是集中式的,因此发生的次数很多。

对于我们的库,我们想要一些可扩展,可维护,开源并且最重要的是可测试的东西:这是JNetworkingKit诞生的那天。

在接下来的几周里,我将描述我们创建它所遵循的过程,所进行的讨论以及所做出的决策。 该库不是完美的,但是我们已经使用了几个月,没有出现任何重大问题,并且我们能够扩展它来解决我们面临的问题。 本文将重点介绍库结构的创建。

其他图书馆

我们想要开源,同时拥有模块化的应用程序。 我们花了一些时间潜入著名的图书馆以了解其结构。
通过分析Alamofire,SwiftyJSON和Realm,我们看到了有关文件夹结构的一些相似之处:

  • 包含源代码的文件夹
  • 文档文件
  • 包含示例的文件夹

所有其他文件都与外部服务,CD / CI相关,或者是支持文件。 有时文件夹结构变得很大,以至于很难理解在哪里找到您需要的东西:我们不愿意将所有内容都显示在根文件夹中,因为它可能会变得一团糟(Alamofire那里有26个文件/文件夹),所以我们决定采用我们自己的结构。

JNetworkingKit结构

我们决定弄清楚文件夹包含的内容,因此我们要做的第一件事是在根级别仅创建2个文件夹:

  • JNetworkingKit ,包含库本身
  • DemoApp ,包含一个用于测试库的演示应用程序(作为开发容器导入)

如果我要求您猜测这些文件夹中的内容,我相信您可以使用名称😉进行猜测。 我们开始将源代码添加到JNetworkingKit文件夹中,并在DemoApp中创建了一个演示应用程序,但是我们开始遇到一些问题。

主文件夹

我们很快就知道保持结构整洁很困难:您需要确定一个许可证 ,为用户添加一个自述文件以及.gitignore文件,以避免提交不必要的事情。 您是否想要CD / CI? 您需要一个文件。 您需要支持Cocopoads吗? 您需要另一个文件。 迦太基和Swift包管理器又如何呢?

将资源划分为多个子文件夹是保持所有内容整洁的唯一方法。

演示应用

由于我们想将该应用程序用作外部Pod,因此我们创建了一个演示应用程序,将其导入为开发 Pod。 我真的建议您做同样的事情:在创建应用程序时,您不必考虑访问修饰符,因为默认情况下所有内容都是internal的,这意味着您可以默认使用项目的每个组件。

创建库时,您只能访问public组件和变量,但是我可以保证您会忘记其中的一些组件,尤其是如果您是根据已在项目中使用的代码创建库的。 创建一个导入库的演示应用程序可以帮助您解决问题:您可以测试代码并直接对其进行修改✌🏻。

你猜怎么了? 发布库后,我们还注意到public关键字缺少some的问题。

子文件夹

子文件夹没有什么特别的:随时创建自己的结构。 我只建议您在库中只有几个文件夹:

  • JNetworkingKit / Source ,包含库本身的代码
  • JNetworkingKit / Resources ,包含诸如图像之类的外部资源

我现在不讨论它,因为它与pod的创建有关,但是它将在以后节省您一些时间。

安装

您可以安装库或应用程序本身。 我们知道深入图书馆会更有趣,但是看到它的实际运行有助于在您自己的项目中实现它。 开始吧!

图书馆

如果要使用该库,可以执行以下命令来克隆它并打开项目。 您将有权访问源代码和我们编写的测试,以确保库的质量。

现在,您可以打开工作区并运行单元测试以检查一切是否正常。

演示应用

您还可以决定下载演示应用程序,以查看运行中的库。 在这种情况下,过程会更长一些:我们想让您针对某些公共API使用该库,而我们选择OMDb API。 这些是成功运行演示所需的步骤:

  • 在OMDb上创建一个API密钥(每天最多可免费查询1000个)
  • 使用以下命令克隆演示应用程序
  • 使用在上一点创建的密钥替换MovieRouter.swift文件中的API密钥。

现在,您可以运行演示应用程序。 有2个屏幕,用于加载图像和有关电影Matrix的信息(我确定您也喜欢它,对吗??)。

结论

这只是有关创建库的第一篇文章,它应该为您提供有关库应具有的结构以及为什么我们选择当前库的信息。 在下一篇文章中,我将开始讨论应用程序本身,并讨论数据模型。

享受您的网络层,
M.