易用可以用于多个设计模式场景中的框架:BlockSequence

  • 时间:
  • 浏览:
  • 来源:互联网

项目案例分析

在项目开发过程中,我们往往会遇到这样一种case:
在有参数的时候不能运行代码,能运行代码的时候却没有参数。我可能说的有点绕。举个例子:
假设我们需要新建一个VC(viewController)并push到navigation上,然后需要在新的VC上创建一个 尺寸为size的view,size的大小由上一个VC决定。
这种情况下,我们可以在新VC的init(withViewSize)方法里创建view吗?不可以,因为这时候UI还没有创建好,那我们能在新VC的viewDidload里创建view吗?不可以,因为viewDidLoad里没有size这个变量。于是我们在新VC里创建了一个CGSize的变量size,在init的时候保存它,在viewDidLoad里按照size尺寸创建view。的确,这样做能达成我们的目的,但是我觉得这种方式不够优雅:
1、size这个成员变量有用的周期很短,从init开始到viewDidLoad就结束了,后续的生命周期里都没有用到
2、如果我们除了制定view的大小外,还指定了颜色、边框粗细、圆角半径( backgroundColor borderColor cornerRadis)等,难道我们为VC创建那么多生命周期极短的变量吗?显然不够优雅
我们可以使用函数式编程解决这个问题。
OC和swift给我们提供了block和closure功能,帮助我们实现这一功能。

解决痛点的思路

我们需要在init函数里创建一个Block,在Block里面,我们捕获 size backgroundColor borderColor cornerRadis等参数,并创建view。只是创建Block,但是我们不打算在init里面执行Block。我们把Block缓存到一个全局的hash表里面,为了后续能找到这个Block,我们需要给这个Block取个名字,例如 SequenceName。当代码执行到viewDidLoad的时候,我们执行名称为SequenceName的那个Block,执行完后Block销毁。上面思路的数据结构如下:
在这里插入图片描述

思路扩展

如果需求更复杂些:进入新的VC后,除了需要创建一个指定尺寸的view,还需要在创建view之后,删除外部VC指定路径的文件。
为了遵循设计模式的“单一职责”原则,我们需要在init里创建两个Block(任务),第一个就是创建view,第二个block(任务)就是删除文件。这两个block拥有相同的blockName。当代码执行到viewDidLoad的时候,我们执行所有的名称叫做SequenceName,执行完后删除block,就完成了需求。这种需求下的数据结构如下图:
在这里插入图片描述
这时候的Block变成了一个Block序列,我们称它为BlockSequence。BlockSequence的长度可以无限扩展,BlockSequence拥有一个名字,我们称这个名字为SequenceName。

进一步扩展

如果别的VC也有类似的需求,那我们需要再建立一个BlockSequence,用相应SequenceName找到并执行Block们。
那么以SequenceName为key的Sequence们存放在哪里呢?
单例是一种全局生命周期设计模式,而且在OC或者swift开发中,单例对象的作用域是全局的。于是我们将BlockSequence们统一加入一个单例中,我们称这个单例叫做 KKBlockSequence。整个KKBlockSequence的数据结构如下图:
在这里插入图片描述

未完,待续。。。

本文链接http://www.dzjqx.cn/news/show-617392.html