參考:AFNetworking 3.0 源碼解讀(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
說明:很多內(nèi)容都是摘抄原文,只是根據(jù)自己的需要進(jìn)行摘抄或者總結(jié),如有不妥請及時(shí)指出碎浇,謝謝灾搏。
我們應(yīng)該看到過很多類似這樣的例子:某個(gè)控件擁有加載網(wǎng)絡(luò)圖片的能力。但這究竟是怎么做到的呢涵卵?看完這篇文章就明白了右遭。
這篇我們會(huì)介紹 AFNetworking 中的3個(gè)UIKit中的分類茵宪。UIActivityIndicatorView UIRefreshControl UIImageView。讀完本篇就能夠明白控件是如何顯示網(wǎng)絡(luò)圖片的弟胀。那么如果你有興趣楷力,可以嘗試讓一個(gè)控件的layer也能夠加載網(wǎng)絡(luò)圖片。
1孵户、UIActivityIndicatorView+AFNetworking UIActivityIndicatorView的這個(gè)分類最簡單萧朝,它只提供了一個(gè)方法:setAnimatingWithStateOfTask: 只要給UIActivityIndicatorView一個(gè) task UIActivityIndicatorView會(huì)根據(jù)數(shù)據(jù)的加載情況 自動(dòng) 開始動(dòng)畫或者結(jié)束動(dòng)畫。
2夏哭、UIRefreshControl+AFNetworking UIRefreshControl的這個(gè)分類的使用跟上邊的UIActivityIndicatorView+AFNetworking一模一樣检柬。
3、UIImageView+AFNetworking UIImageView是最常用的顯示圖片的控件竖配。額外增加了 placeholderImage(替代圖片) 這個(gè)屬性和 success failure 這兩個(gè)block來自定義一些事件何址。最后增加了兩個(gè)取消某個(gè)狀態(tài)下的圖片下載的方法。我們看下邊的圖片就好了:
UIImageView+AFNetworking
objc_setAssociatedObject
這里出現(xiàn)了很多調(diào)用objc_setAssociatedObject的地方进胯,簡單解釋一下:
objc_setAssociatedObject方法中第二個(gè)參數(shù)是一個(gè)地址用爪,因此我們可以用@selector或者自定義一個(gè)全局的const字段,取它的地址胁镐,如:
定義了這么一個(gè)屬性
@property (readwrite, nonatomic, strong)NSString *abc;
實(shí)現(xiàn)如下:
- (NSString *)abc {
return objc_getAssociatedObject(self, &abcde);
}
使用如下偎血,和普通的沒有太大區(qū)別:
UIImageView *imageView = [[UIImageView alloc] init];
[imageView setValue:@"qwer" forKey:@"abc"];
NSString *str = [imageView valueForKey:@"abc"];
NSLog(@"%@",str);
核心方法
- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest
placeholderImage:(UIImage *)placeholderImage
success:(void (^)(NSURLRequest *request, NSHTTPURLResponse * _Nullable response, UIImage *image))success
failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse * _Nullable response, NSError *error))failure
對該方法的邏輯,描述如下:
1盯漂、我們規(guī)定颇玷,使用這個(gè)分類每加載一次圖片就生成一個(gè)af_activeImageDownloadReceipt,這個(gè)憑據(jù)一旦下載完成后就缆,就要設(shè)置為nil
2帖渠、首先判斷urlRequest是否有效,有效繼續(xù)往下走竭宰,無效的話取消之前的下載空郊,并用賦值替代圖片份招。說明,如果urlRequest無效狞甚,之前的下載也會(huì)被取消掉
3脾还、判斷當(dāng)前添加的下載任務(wù),和正在進(jìn)行的下載是不是一樣的入愧,如果一樣鄙漏,則取消這個(gè)添加的任務(wù)
4、不一樣的話棺蛛,就取消之前的下載任務(wù)
5怔蚌、在緩存中取圖片,取到了直接返回成功旁赊,否則先用替代圖片顯示桦踊,并開始下載