版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.03.06 |
前言
我們做APP發起網絡請求,都離不開一個非常有用的框架AFNetworking,可以說這個框架的知名度已經超過了蘋果的底層網絡請求部分,很多人可能不知道蘋果底層是如何發起網絡請求的,但是一定知道
AFNetworking
,接下來幾篇我們就一起詳細的解析一下這個框架。感興趣的可以看上面寫的幾篇。
1. AFNetworking源碼探究(一) —— 基本介紹
2. AFNetworking源碼探究(二) —— GET請求實現之NSURLSessionDataTask實例化(一)
3. AFNetworking源碼探究(三) —— GET請求實現之任務進度設置和通知監聽(一)
4. AFNetworking源碼探究(四) —— GET請求實現之代理轉發思想(一)
5. AFNetworking源碼探究(五) —— AFURLSessionManager中NSURLSessionDelegate詳細解析(一)
6. AFNetworking源碼探究(六) —— AFURLSessionManager中NSURLSessionTaskDelegate詳細解析(一)
7. AFNetworking源碼探究(七) —— AFURLSessionManager中NSURLSessionDataDelegate詳細解析(一)
8. AFNetworking源碼探究(八) —— AFURLSessionManager中NSURLSessionDownloadDelegate詳細解析(一)
9. AFNetworking源碼探究(九) —— AFURLSessionManagerTaskDelegate中三個轉發代理方法詳細解析(一)
10. AFNetworking源碼探究(十) —— 數據解析之數據解析架構的分析(一)
11. AFNetworking源碼探究(十一) —— 數據解析之子類中協議方法的實現(二)
12. AFNetworking源碼探究(十二) —— 數據解析之子類中協議方法的實現(三)
13. AFNetworking源碼探究(十三) —— AFSecurityPolicy與安全認證 (一)
14. AFNetworking源碼探究(十四) —— AFSecurityPolicy與安全認證 (二)
15. AFNetworking源碼探究(十五) —— 請求序列化之架構分析(一)
16. AFNetworking源碼探究(十六) —— 請求序列化之協議方法的實現(二)
17. AFNetworking源碼探究(十七) —— _AFURLSessionTaskSwizzling實現方法交換(轉載)(一)
18. AFNetworking源碼探究(十八) —— UIKit相關之AFNetworkActivityIndicatorManager(一)
19. AFNetworking源碼探究(十九) —— UIKit相關之幾個分類(二)
20. AFNetworking源碼探究(二十) —— UIKit相關之AFImageDownloader圖像下載(三)
21. AFNetworking源碼探究(二十一) —— UIKit相關之UIImageView+AFNetworking分類(四)
22. AFNetworking源碼探究(二十二) —— UIKit相關之UIButton+AFNetworking分類(五)
23. AFNetworking源碼探究(二十三) —— UIKit相關之UIWebView+AFNetworking分類(六)
24. AFNetworking源碼探究(二十四) —— UIKit相關之UIProgressView+AFNetworking分類(七)
回顧
上一篇主要分析了UIProgressView+AFNetworking
分類,主要實現了上傳任務和下載任務與進度之間的綁定。這一篇主要分析UIRefreshControl+AFNetworking
這個分類。
接口API
下面看一下接口API
/**
This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically beginning and ending refreshing depending on the loading state of a session task.
*/
@interface UIRefreshControl (AFNetworking)
///-----------------------------------
/// @name Refreshing for Session Tasks
///-----------------------------------
/**
Binds the refreshing state to the state of the specified task.
@param task The task. If `nil`, automatic updating from any previously specified operation will be disabled.
*/
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
@end
該類為UIKit框架的UIRefreshControl
類添加方法。 根據會話任務的加載狀態,此類別中的方法支持自動開始和結束刷新。
該接口就一個方法,將任務狀態和刷新狀態進行了綁定。
通知觀察者類
在.m實現中,大家會發現不僅是這個AFNetworking分類,還有一個通知貫徹者類AFRefreshControlNotificationObserver
。這個通知觀察者類起到觀察任務狀態的作用,并且.h文件中那個方法的接口,可以進行了消息的轉發,最后在AFRefreshControlNotificationObserver
中進行了處理。
下面我們先看一下這個通知觀察者類接口。
@interface AFRefreshControlNotificationObserver : NSObject
@property (readonly, nonatomic, weak) UIRefreshControl *refreshControl;
// 用于初始化
- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl;
// 用于.h中方法的轉發實現
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
@end
AFNetworking runtime綁定觀察者
這里就是利用runtime給AFNetworking類綁定觀察者,在里面實例化了AFRefreshControlNotificationObserver
并進行了綁定。
- (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;
}
// 初始化觀察者類
- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl
{
self = [super init];
if (self) {
_refreshControl = refreshControl;
}
return self;
}
接口的轉發實現
轉發實現主要采用下面這個方法
- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task {
[[self af_notificationObserver] setRefreshingWithStateOfTask:task];
}
這就轉發到了觀察者類中進行了實現。
- (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];
if (task) {
UIRefreshControl *refreshControl = self.refreshControl;
if (task.state == NSURLSessionTaskStateRunning) {
[refreshControl beginRefreshing];
[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];
} else {
[refreshControl endRefreshing];
}
}
}
這里首先移除了開始、暫停和完成的通知,然后進行了判斷,如果任務存在,且任務的狀態正在運行,那么就添加開始、暫停和完成的通知。如果任務的狀態不是在運行,那么就調用方法停止刷新[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];
});
}
后記
本篇主要講述了
UIRefreshControl+AFNetworking
這個分類,將刷新狀態和任務狀態進行了綁定和同步。