iOS源码分析二十例 (2.DZNEmptyDataSet)

下载地址:
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

 

转载于:https://my.oschina.net/wyo/blog/836852

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值