iOS 第三方源碼解析

SDWebImage

首先SDWebImage是我們經(jīng)常用的一個(gè)加載網(wǎng)絡(luò)圖片的庫(kù),內(nèi)部很好的處理了緩存、下載、解碼之間關(guān)系,使得在性能上有很大的提升。
SDWebImage大致可以分為5大塊:
我們拿UIImageView來(lái)說(shuō),入口就是

[imageView sd_setImageWithURL:nil]
  1. wrap結(jié)構(gòu):充分使用了單一原則和接口隔離的設(shè)計(jì)原則,UIImageView跟UIButton等空間區(qū)分開(kāi)來(lái),互相不干擾。但是他們都會(huì)走到UIView的 sd_internalSetImageWithURL方法,在這里處理相關(guān)邏輯。
  2. 管理:使用SDImageManage類來(lái)調(diào)節(jié)緩存跟回調(diào)之間的關(guān)系。當(dāng)接收到此URL,會(huì)先進(jìn)行取消下載,避免多次下載。作用就是調(diào)度緩存下載外層結(jié)構(gòu)之間的關(guān)系回調(diào)
  3. 緩存:然后sd_queryCacheOperationForKey內(nèi)部尋找緩存,先根據(jù)NSCache在內(nèi)存中查找是否存在緩存,然后在磁盤中查找緩存,這里有個(gè)小細(xì)節(jié)就是,如果在磁盤中查到緩存就將緩存存入內(nèi)存中去,如果兩個(gè)都沒(méi)有找到需要進(jìn)行下載。
  4. 下載:使用SDImageOperationQuque來(lái)進(jìn)行管理下載,創(chuàng)建一個(gè)任務(wù),啟動(dòng)section進(jìn)行下載,通知管理類,來(lái)處理圖片。
  5. 解碼:網(wǎng)絡(luò)圖片一般會(huì)偏大,對(duì)于我們的圖片渲染性能來(lái)說(shuō)是個(gè)很大的損失,所以這里講圖片進(jìn)行解碼操作,生成位圖返回新圖片,這樣在GPU渲染的時(shí)候可以直接使用位圖來(lái)進(jìn)行渲染,極大的提升性能。
    然后異步將圖片存入緩存之中去。清除緩存的時(shí)候時(shí)候會(huì)將默認(rèn)1周的圖片進(jìn)行清理,避免浪費(fèi)空間。

總結(jié):通過(guò)源碼學(xué)到了作者的編程思想,設(shè)計(jì)原則體現(xiàn)的淋漓盡致,將類于類之間充分的解耦,枚舉使用位移的方式,節(jié)省內(nèi)存開(kāi)銷。下載使用Operation隊(duì)列來(lái)管理下載類,對(duì)自己以后做下載相關(guān)需求的時(shí)候很大的提升,緩存的思維,內(nèi)存報(bào)警之后的處理。圖片的解碼了解到性能上的優(yōu)化相關(guān)的操作等等。

YYCache

YYCache是我們通常使用的緩存類,當(dāng)我們做頁(yè)面緩存的時(shí)候是一個(gè)非常不錯(cuò)的選擇。
緩存分為2類,一種是內(nèi)存緩存,一種是磁盤緩存

  1. 內(nèi)存緩存:YYMeroryCache
    適用于體積小,速度快。內(nèi)部實(shí)現(xiàn)了LRU(緩存淘汰算法),使用雙向鏈表來(lái)存儲(chǔ)。
    LRU的實(shí)現(xiàn):淘汰訪問(wèn)頻率低的節(jié)點(diǎn),當(dāng)存入一個(gè)新節(jié)點(diǎn)就放置頭部,放存入一個(gè)已經(jīng)存在的節(jié)點(diǎn)就把當(dāng)前節(jié)點(diǎn)拿出來(lái)放置頭部。刪除的時(shí)候從鏈表尾端開(kāi)始刪除。
    鏈表采用C語(yǔ)言的字典來(lái)實(shí)現(xiàn),節(jié)點(diǎn)內(nèi)部元素有parentNode、childNode,緩存開(kāi)銷等變量。采用pthread_mutex_lock鎖的機(jī)制來(lái)處理資源訪問(wèn)的時(shí)候線程安全。
  2. 磁盤緩存: YYDiskCache
    適用于體積大,相對(duì)來(lái)說(shuō)速度慢。
    使用YYKVStore來(lái)管理對(duì)文件的操作,磁盤緩存分2種,一種是數(shù)據(jù)庫(kù)存儲(chǔ),一種是數(shù)據(jù)庫(kù)/文件混合存儲(chǔ)
    當(dāng)資源>20KB的時(shí)候會(huì)采用混合存儲(chǔ),此時(shí)數(shù)據(jù)的元數(shù)據(jù)存在sqlite3數(shù)據(jù)庫(kù)中,數(shù)據(jù)存在文件系統(tǒng)中去。采用信號(hào)量對(duì)資源進(jìn)行加鎖。
    總結(jié):YYCache的設(shè)計(jì)流程:先內(nèi)存后磁盤,雙重實(shí)現(xiàn)來(lái)對(duì)數(shù)據(jù)的緩存,LRU算法,雙向鏈表的使用。
    磁盤緩存使用數(shù)據(jù)庫(kù)跟文件混合存儲(chǔ),性能上極大的提升。
    使用pthread_metux_lock和信號(hào)量分別的不同的方式進(jìn)行線程安全的維護(hù)。他們的區(qū)別在于信號(hào)量在等待的時(shí)候性能優(yōu)于pthread_metux_lock,等待的時(shí)候不消耗CPU。而且信號(hào)量在處理線程等待的時(shí)候會(huì)對(duì)線程進(jìn)行順序進(jìn)行,而pthread_metux_lock等待的時(shí)候是無(wú)序的。

Masorny

Masorny是一個(gè)可以對(duì)屏幕進(jìn)行適配一個(gè)輕量級(jí)的布局架構(gòu),他是封裝了系統(tǒng)的AutoLayout來(lái)實(shí)現(xiàn)的。內(nèi)部使用了鏈?zhǔn)骄幊痰娘L(fēng)格,點(diǎn)語(yǔ)法,可以循環(huán)式調(diào)用自身,增加了diamante的可讀性,優(yōu)化了代碼風(fēng)格。MASConstraintMaker是一個(gè)工廠類。
總結(jié):鏈?zhǔn)骄幊趟枷耄褂命c(diǎn)語(yǔ)法,隱式block回調(diào)。

WebViewJavaScriptBridge

WebViewJavaScriptBridge是H5跟OC交互的一個(gè)常用的庫(kù)。

  1. 初始化:在OC端初始化bridge,H5端寫入setupJavascript方法,創(chuàng)建一個(gè)iframe標(biāo)簽,設(shè)置scr為“https://bridge_loaded”,注入JS腳本,webview的代理方法webView:decidePolicyForNavgationAction:...方法可以檢測(cè)到。
  2. OC調(diào)用H5:調(diào)用callHandle方法,base調(diào)用sendData方法,封裝一個(gè)唯一的消息id,存在本地。接著調(diào)用,將消息json序列化,webview注入JS,執(zhí)行H5中對(duì)應(yīng)的handleName的方法回調(diào)。
    3.H5調(diào)用OC:H5端調(diào)用callHandle,本地調(diào)用registerHandle,將handleName存入字典。H5調(diào)用callHandle,觸發(fā)注入的JS代碼中的callHandle方法,內(nèi)部調(diào)用__doSend方法,將iframe的scr重新改寫,這時(shí)webView的webview:decidePolicyForNavgationAction代理方法,根據(jù)handleName找到存儲(chǔ)在本地的messageQueue的block,執(zhí)行block,調(diào)用OC的方法。
    總結(jié):OC通過(guò)webview執(zhí)行JS代碼,來(lái)通知H5,觸發(fā)回調(diào)。H5通過(guò)iframe標(biāo)簽設(shè)置scr,然后webView的decidePolicyForNavgationAction方法接收到響應(yīng),觸發(fā)回調(diào)方法。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374