該文章閱讀的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