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

本文介绍如何使用AFNetworking为UIRefreshControl绑定任务,并根据任务状态自动控制刷新开始与结束。通过创建私有类AFRefreshControlNotificationObserver,利用NSNotification进行监听,实现了刷新控件与网络请求的联动。

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

这个分类可以为UIRefreshControl绑定一个task,然后根据task的加载状态自动开始和结束刷新。

1.接口文件

/**
 为UIRefreshControl绑定指定的task
 */
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
复制代码

2.AFRefreshControlNotificationObserver私有类

2.1.属性

/**
 保存要绑定task的刷新控件
 */
@property (readonly, nonatomic, weak) UIRefreshControl *refreshControl;
复制代码

2.2.方法

/**
 以指定刷新控件初始化的方法
 */
- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl;

/**
 为UIRefreshControl绑定指定的task
 */
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
复制代码

2.3.实现

  • 接口方法的实现
- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl
{
    self = [super init];
    if (self) {
        // 用属性保存传入的参数
        _refreshControl = refreshControl;
    }
    return self;
}

- (void)setRefreshingWithStateOfTask:(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) {
        // 获取到传入的刷新控件
        UIRefreshControl *refreshControl = self.refreshControl;
        // 如果task的状态是正在运行中
        if (task.state == NSURLSessionTaskStateRunning) {
            // 刷新控件开始刷新
            [refreshControl beginRefreshing];

            // 注册通知监听task的开始、完成和暂停
            [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task];
            [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task];
            [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task];
        // 如果task的状态不是是正在运行中
        } else {
            // 刷新控件停止刷新
            [refreshControl endRefreshing];
        }
    }
}
复制代码
  • 通知回调方法的实现
- (void)af_beginRefreshing {
    // 在主队列异步调用刷新控件的开始刷新
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.refreshControl beginRefreshing];
    });
}

- (void)af_endRefreshing {
    // 在主队列异步调用刷新控件的停止刷新
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.refreshControl endRefreshing];
    });
}
复制代码
  • 生命周期方法实现
- (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];
}
复制代码

3.方法实现

- (AFRefreshControlNotificationObserver *)af_notificationObserver {
    // 先通过关联对象获取为分类创建的属性
    AFRefreshControlNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver));
    // 如果属性为空
    if (notificationObserver == nil) {
        // 创建刷新控件通知观察者对象
        notificationObserver = [[AFRefreshControlNotificationObserver alloc] initWithActivityRefreshControl:self];
        // 通过关联对象将创建的对象保存到属性中
        objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return notificationObserver;
}

- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task {
    // 获取到刷新控件通知观察者对象并为之绑定task
    [[self af_notificationObserver] setRefreshingWithStateOfTask:task];
}
复制代码

4.总结

可以看到这个分类的实现基本和UIActivityIndicatorView+AFNetworking分类的实现一模一样。都是依靠分类内部的私有类通过对绑定task相关属性添加通知观察,来控制刷新控件的动作。

源码阅读系列:AFNetworking

源码阅读: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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值