源码阅读:AFNetworking(十一)——UIActivityIndicatorView+AFNetworking

该文章阅读的AFNetworking的版本为3.2.0。bash

这是一个UIActivityIndicatorView类的分类,这个类提供了一个根据task的加载状态自动控制加载菊花显示和隐藏的方法。异步

1.接口文件

1.1.方法

接口文件只向外部暴露了一个方法:async

/**
 为一个指定的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,在方法内部就会生成一个负责管理加载菊花控件的对象,并经过关联对象保存。post

负责管理加载菊花控件的对象,会经过添加通知监听task的开始与中止,来控制空间的展现与隐藏。ui

源码阅读系列:AFNetworkingatom

源码阅读:AFNetworking(一)——从使用入手spa

源码阅读:AFNetworking(二)——AFURLRequestSerialization3d

源码阅读:AFNetworking(三)——AFURLResponseSerializationcode

源码阅读:AFNetworking(四)——AFSecurityPolicyserver

源码阅读:AFNetworking(五)——AFNetworkReachabilityManager

源码阅读:AFNetworking(六)——AFURLSessionManager

源码阅读:AFNetworking(七)——AFHTTPSessionManager

源码阅读:AFNetworking(八)——AFAutoPurgingImageCache

源码阅读:AFNetworking(九)——AFImageDownloader

源码阅读:AFNetworking(十)——AFNetworkActivityIndicatorManager

源码阅读:AFNetworking(十一)——UIActivityIndicatorView+AFNetworking

源码阅读:AFNetworking(十二)——UIButton+AFNetworking

源码阅读:AFNetworking(十三)——UIImageView+AFNetworking

源码阅读:AFNetworking(十四)——UIProgressView+AFNetworking

源码阅读:AFNetworking(十五)——UIRefreshControl+AFNetworking

源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

相关文章
相关标签/搜索