该文章阅读的AFNetworking的版本为3.2.0。
这是一个UIActivityIndicatorView类的分类,这个类提供了一个根据task的加载状态自动控制加载菊花显示和隐藏的方法。
1.接口文件
1.1.方法
接口文件只向外部暴露了一个方法:
/**
为一个指定的task绑定一个加载菊花控件
*/
- (void)setAnimatingWithStateOfTask:(nullable NSURLSessionTask *)task;
2.实现文件
2.1.AFActivityIndicatorViewNotificationObserver私有类
2.1.1.接口
2.1.1.1.属性
/**
加载菊花控件
*/
@property (readonly, nonatomic, weak) UIActivityIndicatorView *activityIndicatorView;
2.1.1.2.方法
/**
以指定的加载菊花控件初始化
*/
- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView;
/**
设置要绑定的task
*/
- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task;
2.1.2.实现
- 接口方法
- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView
{
self = [super init];
if (self) {
// 保存传入的加载菊花控件
_activityIndicatorView = activityIndicatorView;
}
return self;
}
- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task {
// 创建通知中心对象
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
// 先移除掉之前添加通知
[notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil];
[notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil];
[notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil];
// 如果传入的task不为nil
if (task) {
// 如果task的状态不是已经执行完成
if (task.state != NSURLSessionTaskStateCompleted) {
// 如果task的状态是运行中就显示加载菊花控件,否则就隐藏
UIActivityIndicatorView *activityIndicatorView = self.activityIndicatorView;
if (task.state == NSURLSessionTaskStateRunning) {
[activityIndicatorView startAnimating];
} else {
[activityIndicatorView stopAnimating];
}
// 注册通知监听task的开始、完成和暂停
[notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task];
[notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task];
[notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidSuspendNotification object:task];
}
}
}
- 通知回调方法
- (void)af_startAnimating {
// 如果接收到了task启动的通知,就在主队列异步回调中显示加载菊花控件
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView startAnimating];
});
}
- (void)af_stopAnimating {
// 如果接收到了task完成或暂停的通知,就在主队列异步回调中隐藏加载菊花控件
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
});
}
- 声明周期方法
- (void)dealloc {
// 移除掉添加通知
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil];
[notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil];
[notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil];
}
2.2.方法实现
- (AFActivityIndicatorViewNotificationObserver *)af_notificationObserver {
// 通过运行时的关联对象为UIActivityIndicatorView添加了一个属性:af_notificationObserver,这个属性保存的就是上面看过的那个私有类
AFActivityIndicatorViewNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver));
if (notificationObserver == nil) {
notificationObserver = [[AFActivityIndicatorViewNotificationObserver alloc] initWithActivityIndicatorView:self];
objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return notificationObserver;
}
- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task {
// 生成AFActivityIndicatorViewNotificationObserver对象,并通过关联对象保存在扩展的属性af_notificationObserver中,然后调用这个对象的绑定task的方法
[[self af_notificationObserver] setAnimatingWithStateOfTask:task];
}
3.总结
可以看到当我们使用这个分类时,只需要通过接口暴露的方法传入想要绑定加载菊花控件的task,在方法内部就会生成一个负责管理加载菊花控件的对象,并通过关联对象保存。
负责管理加载菊花控件的对象,会通过添加通知监听task的开始与停止,来控制空间的展示与隐藏。
源码阅读系列:AFNetworking
源码阅读:AFNetworking(二)——AFURLRequestSerialization
源码阅读:AFNetworking(三)——AFURLResponseSerialization
源码阅读:AFNetworking(四)——AFSecurityPolicy
源码阅读:AFNetworking(五)——AFNetworkReachabilityManager
源码阅读:AFNetworking(六)——AFURLSessionManager
源码阅读:AFNetworking(七)——AFHTTPSessionManager
源码阅读:AFNetworking(八)——AFAutoPurgingImageCache
源码阅读:AFNetworking(九)——AFImageDownloader
源码阅读:AFNetworking(十)——AFNetworkActivityIndicatorManager
源码阅读:AFNetworking(十一)——UIActivityIndicatorView+AFNetworking
源码阅读:AFNetworking(十二)——UIButton+AFNetworking
源码阅读:AFNetworking(十三)——UIImageView+AFNetworking
源码阅读:AFNetworking(十四)——UIProgressView+AFNetworking