下载地址:
https://github.com/dzenbot/DZNEmptyDataSet
DZNEmptyDataSet的最外层接口只有一个对UIScrollView的扩展, 通过对UIScrollView的emptyDataSetSource和emptyDataSetDelegate的配置来具体的显示内容, 以用于在UIScrollView中内容为空时候显示具体的控件. 与MBProgressHUD一样, DZNEmptyDataSet也是一个非常简短的库, 所以, 这里也只是使用一个短篇幅来将其中的要点.
主要要理清的点如下:
1. objc_setAssociatedObject / objc_getAssociatedObject
通过这两个函数, 达到在扩展中增加成员变量的方法, 这是Objective-C的一大重要特性, 可以依据这个特性, 增加很多特别有用的功能.
2. DZNWeakObjectContainer
代码如下:
@interface DZNWeakObjectContainer : NSObject
@property (nonatomic, readonly, weak) id weakObject;
- (instancetype)initWithWeakObject:(id)object;
@end
这是一个纯属技巧的东西, 整个类就是一个weak的包装, 将外部对象以weak的形式包装到其中来, 然后自身以Retain的形式存储到objc_setAssociatedObject中去, 这样一来, 一旦包装中的内容失效, Container仍然存在, 代码就不需要过于复杂的去处理额外的内存判断了.
3. dzn内部有一个dzn_itemsCount函数, 用于获取当前ScrollView为TableView或者CollectionView的时候, 其中的Cell数量. 不过事后的使用, 仅仅用于判断是否为空, 然后显示DZNEmptyDataSet的View. 不过, 个人来看, 这个函数应该改成dzn_isEmpty函数, 在实际操作的时候, 可以不用完全计算完所有数据, 而是一旦判断某个Section中的Cell数量存在的时候, 立即返回false. 如果在实际的代码中, 如果需要通过网络实时计算数量, 这个会减少很多多余的计算量.
4. 一系列dzn_xxx函数都是对delegate的回调做封装, 多了一个判断和asset. 如果直接使用Optional在Delegate中就好了, 不是特别有必要做这一层封装.
个人对整个源码结构提取了一下分析, 由于整体结构非常简单, 一个非常简答的逻辑图即可表达完毕.
这两篇都是一个非常简单的代码库, 整体难度几乎没有, 也没有任何摘抄代码的必要, 所以, 稍微罗列一下代码中的一些要点, 即可简单理解. 但是, 一直找这种小项目做分析, 难度就太小了, 下一篇开始, 就要稍微复杂一点了.
敬请待下一篇: SDWebImage