SDWebImage源碼分析(五)

11?NSData+ImageContentType

+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {

if (!data) {

return SDImageFormatUndefined;

}

uint8_t c;

[data getBytes:&c length:1];

switch (c) {

case 0xFF:

return SDImageFormatJPEG;

case 0x89:

return SDImageFormatPNG;

case 0x47:

return SDImageFormatGIF;

case 0x49:

case 0x4D:

return SDImageFormatTIFF;

case 0x52:

// R as RIFF for WEBP

if (data.length < 12) {

return SDImageFormatUndefined;

}

NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];

if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {

return SDImageFormatWebP;

}

}

return SDImageFormatUndefined;

}

這個(gè)就是根據(jù)文件頭判斷圖片格式甜紫。而不是根據(jù)后綴名。

12.UIView+WebCacheOperation

這個(gè)類三個(gè)public方法

1.- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key;

2.- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key;

3.- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key;

先看

- (SDOperationsDictionary *)operationDictionary {

SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey);

if (operations) {

return operations;

}

operations = [NSMutableDictionary dictionary];

objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

return operations;

}

這個(gè)函數(shù)就是給uiview 增加一個(gè)關(guān)聯(lián)引用检眯,綁定一個(gè)字典。



- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { // Cancel in progress downloader from queue SDOperationsDictionary *operationDictionary = [self operationDictionary]; id operations = operationDictionary[key]; if (operations) { if ([operations isKindOfClass:[NSArray class]]) { for (idoperation in operations) { if (operation) { [operation cancel]; } } } else if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){ [(id) operations cancel];

}

[operationDictionary removeObjectForKey:key];

}

}

先看cancel 函數(shù)

這個(gè)先獲取字典,根據(jù)key 找到operations 趾断。要是NSArray,就將數(shù)組里的對(duì)象(id<SDWebImageOperation>)調(diào)用cancel

要是id<SDWebImageOperation>對(duì)象就調(diào)用cancel函數(shù)兆蕉,最后從字典移除這個(gè)key


- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key {

if (key) {

[self sd_cancelImageLoadOperationWithKey:key];

if (operation) {

SDOperationsDictionary *operationDictionary = [self operationDictionary];

operationDictionary[key] = operation;

}

}

}

l這個(gè)函數(shù)就是講原來的key 對(duì)應(yīng)的數(shù)組全部取消掉。在重新復(fù)制key 和operation

- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key {

if (key) {

SDOperationsDictionary *operationDictionary = [self operationDictionary];

[operationDictionary removeObjectForKey:key];

}

}

移除字典key


12.UIView+WebCache

這個(gè)類我們只看一個(gè)方法

- (void)sd_internalSetImageWithURL:(nullable NSURL *)url

placeholderImage:(nullable UIImage *)placeholder

options:(SDWebImageOptions)options

operationKey:(nullable NSString *)operationKey

setImageBlock:(nullable SDSetImageBlock)setImageBlock

progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock

completed:(nullable SDExternalCompletionBlock)completedBlock


由于這些都在以前的文章分析過缤沦。這里就簡單再回顧下虎韵,不貼代碼了。

1.取消operation 操作

2.將url 綁定到關(guān)聯(lián)引用上

3.要是沒有配置延遲加載placeholder 那就直接加載placeholder

4.有url ?缸废。檢查是否要設(shè)置指示器包蓝。有就增加指示器

5.加載圖片

6.將operation 綁定到uiview 綁定的字典里

7.數(shù)據(jù)返回,移除指示器企量。

8要是 self 銷毀了测萎,就return

9.要是有image 并且配置SDWebImageAvoidAutoSetImage 而且有completedBlock 就調(diào)用completedBlock

10 其他的判斷要是有image 調(diào)用方法- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBloc

12.其他的,要是配置?SDWebImageDelayPlaceholder 也調(diào)用- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBloc

13.要是finish 標(biāo)記為YES 那么調(diào)用completeBlock

13UIImageView+WebCache


這個(gè)里面其實(shí)沒啥調(diào)用可說的届巩,最后都調(diào)用到UIView中的方法绳泉。

14.UIImageView+HighlightedWebCache

給UIimageView 的heightImage賦值。

還有其他的類這里就不解釋姆泻。上面的類看懂了后面的這些就簡單很多零酪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拇勃,隨后出現(xiàn)的幾起案子四苇,更是在濱河造成了極大的恐慌,老刑警劉巖方咆,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月腋,死亡現(xiàn)場離奇詭異,居然都是意外死亡瓣赂,警方通過查閱死者的電腦和手機(jī)榆骚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌集,“玉大人妓肢,你說我怎么就攤上這事∩幌耍” “怎么了碉钠?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卷拘。 經(jīng)常有香客問我喊废,道長,這世上最難降的妖魔是什么栗弟? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任污筷,我火速辦了婚禮,結(jié)果婚禮上乍赫,老公的妹妹穿的比我還像新娘瓣蛀。我一直安慰自己斤寂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布揪惦。 她就那樣靜靜地躺著,像睡著了一般罗侯。 火紅的嫁衣襯著肌膚如雪器腋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天钩杰,我揣著相機(jī)與錄音纫塌,去河邊找鬼。 笑死讲弄,一個(gè)胖子當(dāng)著我的面吹牛措左,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播避除,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼怎披,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了瓶摆?” 一聲冷哼從身側(cè)響起凉逛,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎群井,沒想到半個(gè)月后状飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡书斜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年诬辈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐吉。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焙糟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出样屠,到底是詐尸還是另有隱情酬荞,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布瞧哟,位于F島的核電站混巧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勤揩。R本人自食惡果不足惜咧党,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陨亡。 院中可真熱鬧傍衡,春花似錦深员、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绣的,卻和暖如春叠赐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡江。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工芭概, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩嘉。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓罢洲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親文黎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惹苗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容