该文章阅读的AFNetworking的版本为3.2.0。bash
这个分类能够为UIRefreshControl
绑定一个task
,而后根据task
的加载状态自动开始和结束刷新。异步
/**
为UIRefreshControl绑定指定的task
*/
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
复制代码
/**
保存要绑定task的刷新控件
*/
@property (readonly, nonatomic, weak) UIRefreshControl *refreshControl;
复制代码
/**
以指定刷新控件初始化的方法
*/
- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl;
/**
为UIRefreshControl绑定指定的task
*/
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
复制代码
- (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];
}
复制代码
- (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];
}
复制代码
能够看到这个分类的实现基本和UIActivityIndicatorView+AFNetworking
分类的实现如出一辙。都是依靠分类内部的私有类经过对绑定task
相关属性添加通知观察,来控制刷新控件的动做。async
源码阅读系列:AFNetworkingpost
源码阅读:AFNetworking(二)——AFURLRequestSerializationatom
源码阅读:AFNetworking(三)——AFURLResponseSerializationspa
源码阅读:AFNetworking(四)——AFSecurityPolicy3d
源码阅读:AFNetworking(五)——AFNetworkReachabilityManagercode
源码阅读:AFNetworking(六)——AFURLSessionManagerserver
源码阅读:AFNetworking(七)——AFHTTPSessionManager
源码阅读:AFNetworking(八)——AFAutoPurgingImageCache
源码阅读:AFNetworking(九)——AFImageDownloader
源码阅读:AFNetworking(十)——AFNetworkActivityIndicatorManager
源码阅读:AFNetworking(十一)——UIActivityIndicatorView+AFNetworking
源码阅读:AFNetworking(十二)——UIButton+AFNetworking
源码阅读:AFNetworking(十三)——UIImageView+AFNetworking
源码阅读:AFNetworking(十四)——UIProgressView+AFNetworking