使用协议扩展管理网络状态
内容? 载入中? 错误? 空吗 丢失…
今天早上,我打开了苹果的音乐应用程序,用一些歌曲抚慰了我的耳朵。 但是,当然,作为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
谢谢阅读。 编码愉快!