使用协议扩展管理网络状态

内容? 载入中? 错误? 空吗 丢失…

今天早上,我打开了苹果的音乐应用程序,用一些歌曲抚慰了我的耳朵。 但是,当然,作为iOS开发人员,我更倾向于研究该应用程序的功能。 我发现的是应用程序处理状态更改的微妙方式。

因此,吸引我去寻找在应用程序中处理网络状态的最佳方法。

假设我们正在构建一个管理四个状态的应用程序,即:
1.内容:数据呈现给用户
2.加载:正在通过网络加载数据
3.错误:通过网络加载数据时遇到错误
4.空:无可用数据显示给用户

出现的问题是:我的代码可重用吗? 我是否遵循DRY原则? 如果我有不同的方法来管理不同类中的状态怎么办? 代码 重构容易吗?

如果您的回答是“否”,则可以参考“解决方案”,否则,请选择意大利面。

解决方案

在WWDC 2015上,Apple推出了面向协议的编程。 它具有最强大的功能: 协议扩展。
等一下你说什么 现在,到底是协议扩展 。 如果您不熟悉此概念,请参阅以下链接:

https://www.raizlabs.com/dev/2015/06/protocol-extensions-swift-2-0/
http://machinethink.net/blog/mixins-and-traits-in-swift-2.0/
http://cutting.io/posts/stateful-mixins-in-swift/

快速看一下演示

让我们从协议开始

我们有一个名为ViewStateProtocol的协议:

让我们来谈谈它。 我们有一个状态管理器类实例(管理添加和删除视图的类),加载,错误和空视图,错误消息和以States Type为参数的方法声明addView (包含各种状态的枚举)

现在,让我们对协议扩展进行一些魔术。
首先,我们创建了一个状态管理器类的实例,该实例负责添加和删除视图。 然后,我们创建加载,错误和空视图对象。

太棒了! 但是,我们仍然需要将这些视图添加到视图控制器的视图中。 那么,该怎么做呢? 没问题,我们有州管理人员来救援。 State Manager类将负责添加这些视图。

好极了! 我们做到了。 但是,等等,我们的State Manager类在哪里。 我们也来看看…

因此,我们拥有所有视图的默认实现。 但是我们如何实施呢? 有没有想过?

协议的实施

我们的视图控制器将实现ViewStateProtocol并在需要显示视图时调用方法。

任何与管理网络相关状态有关的视图控制器都可以实现ViewStateProtocol并重用所有代码。 就这么简单🙂

包起来

协议扩展允许我们具有混合模式。 它对代码的 可重用性可维护性有利。
这个github仓库有一个演示应用程序。

LH17 / ViewStates
ViewStates –使用协议扩展管理网络状态 github.com

谢谢阅读。 编码愉快!