SDWebImageIndicator
我是前言#
- SDWebImageIndicator 在图像加载期间定制指示器的协议。
判断平台#
#if SD_UIKIT || SD_MAC
//code...
#endif- 如果是 UIkit 平台以及 mac 会进行 code 的编译。
协议声明#
@protocol SDWebImageIndicator <NSObject>
@required
/**
The view associate to the indicator.
@return The indicator view
*/
@property (nonatomic, strong, readonly, nonnull) UIView *indicatorView;
/**
Start the animating for indicator.
*/
- (void)startAnimatingIndicator;
/**
Stop the animating for indicator.
*/
- (void)stopAnimatingIndicator;
@optional
/**
Update the loading progress (0-1.0) for indicator. Optional
@param progress The progress, value between 0 and 1.0
*/
- (void)updateIndicatorProgress:(double)progress;
@end- 这个协议也遵守了
协议。 - 这个协议声明一个属性,但是这个属性在这个地方也只是方法声明。这个地方是生成了 get 方法。
协议的实现#
- 在 SDWebImageIndicator.h 文件里有一个类的声明,这个类遵循了 SDWebImageIndicator 协议。同时出现了和协议的属性名字是完全一样的属性名称 indicatorView。
@interface SDWebImageActivityIndicator : NSObject <SDWebImageIndicator>
#if SD_UIKIT
@property (nonatomic, strong, readonly, nonnull) UIActivityIndicatorView *indicatorView;
#else
@property (nonatomic, strong, readonly, nonnull) NSProgressIndicator *indicatorView;
#endif
@end- 上诉代码就是一个巧妙之处,一个协议里面的属性不是真正的属性,它只是方法声明,另一个巧妙之处是起到提醒遵守者你要有一个 indicatorView 属性哦。更牛的其实在后边。
//.m 文件
@interface SDWebImageActivityIndicator ()
#if SD_UIKIT
@property (nonatomic, strong, readwrite, nonnull) UIActivityIndicatorView *indicatorView;
#else
@property (nonatomic, strong, readwrite, nonnull) NSProgressIndicator *indicatorView;
#endif
@end- 这个里面可以发现作者有扩展一个 indicatorView 属性,这是又是为什么呢,为了实现 indicatorView 属性的方法。同时 为了 SDWebImageActivityIndicator 初始化的时候使用到这个属性的 get 方法。
协议总结#
协议里使用属性方法的声明。
遵循者要和协议属性保持一致也要有这个属性。
扩展里添加这个属性第一 方法的实现作用,第二 SDWebImageActivityIndicator 初始化要使用这个属性。
作者代码连贯性代码统一性做了很大优化。
分类#
- 首先这个分类功能是快速建立 SDWebImageIndicator 对象。并使用这个对象。
@interface SDWebImageProgressIndicator (Conveniences)
/// default-style progress indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *defaultIndicator;
/// bar-style progress indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *barIndicator API_UNAVAILABLE(macos, tvos);
@end分析#
- 首先这个类 SDWebImageIndicator 包括了协议,分类,以及 Progress Indicator 这个类。
- 这个,h .m 文件有两个类因为功能相似所以放在一起,同时都遵循一样的协议,之所以这样写遵循一样的协议杜绝了两套方法声明。但是协议的实现还是要写的。
SDWebImageIndicator 学习要点#
- 协议中加属性省略写 set 或者 get 方法
- 用遵循协议代替方法声明利于以后扩展。
- 将实现和分类写在一起减少文件。保持很好封装性,写 code 的时候不用多次翻看。
- 分类中为类方法,方便使用。
- code 使用横向扩展方案,以后可以参考已经实现的扩展多个控件支持这个功能。