(iOS)我所用到的第三方開源庫源碼閱讀分析筆記

[TOC]

一。UITableView+FDTemplateLayoutCell

首發(fā)地址

作者也很能寫阱州,上面的地址中有作者的文章鼓寺,介紹這個庫的使用方法勋拟。

  • 閱讀和評論
  1. 使用block,將UITableViewDelegate最重要的兩個函數:heightForRowAtIndexPath:cellForRowAtIndexPath:給統一了
  • 通過block讓用戶裝填cell的信息后妈候,使用系統提供的systemLayoutSizeFittingSize:計算出在實際的cell大懈颐摇(fd_heightForCellWithIdentifier
  • 對tableviewcel的加載進行了優(yōu)化,即在idle階段pre cache了cell height (fd_precacheIfNeeded

贊苦银!

二啸胧。Shimmer

首發(fā)地址

  • 介紹
    Shimmer是facebook在paper應用中采用的loading UI,該效果讓字體閃爍出銀色的光澤墓毒,很贊吓揪。


    (圖片來自Shimmer在github上的主頁

  • 閱讀和評論

  1. Shimmer的效果由FBShimmeringMaskLayer : CAGradientLayer來實現,其opacity被漸變以顯現出底色所计,從而造成高亮的效果(_updateMaskColors & _updateMaskLayout
  • 上面的maskposition被animate柠辞,從而造成閃動(高亮移動)的效果(shimmer_slide_animation

贊~

三。XYPieChart

首發(fā)地址

  • 介紹
    選用XYPieChart是因其小巧和華美的展開效果主胧。之前用core-plot叭首,感覺其結構的確非常好习勤,但是文檔過于粗糙。現在看中的ios-charts是由android移植而來焙格,看起來不錯图毕,但還未使用過。
    不過我至今沒看到一個能在pie chart上比較好的顯示折線legend的庫眷唉。誰有推薦嗎予颤?自己雖然有寫一個,但是處理的極端情況還不夠全冬阳,也許有空可以發(fā)布出來看看蛤虐。


    (圖片來自XYPieChart在github上的主頁

  • 閱讀和評論

  1. 每個pie slice都是一個layer(SliceLayer : CAShapeLayer),其展開動畫由startAngleendAngle兩個double屬性決定
  • 動畫效果的參數由createArcAnimationForKey:創(chuàng)建肝陪,startAngleendAngle分開animate驳庭。CABasicAnimation按照用戶定義的動畫效果來更新startAngleendAngle的值【注:由于startAngleendAngle是用戶自定義的property,不是UIView內建的關聯了動畫效果的property氯窍,因此CABasicAnimation僅能animate這兩個property的數值饲常,此數值所對應的UI animation需要靠下一步來完成】
  • CABasicAnimation delegate的animationDidStart中,創(chuàng)建用于展示UI animation的timerupdateTimerFired)狼讨。timer中取得當前startAngleendAngle的值【注:上述贝淤,此2數值被CABasicAnimation所animate了】,然后繪制出相應的pie slice
    【第3步可以對比pop庫中的相應實現政供。pop中利用了CADisplaylink的回調霹娄,實現了和屏幕刷新率相同動畫;而此處是自己創(chuàng)建的NSTimer鲫骗。感覺pop更優(yōu)〔染В】

贊~

四执泰。JLRoutes

首發(fā)地址

  • 介紹
    通過App link,打開App后直接顯示某個特定內容或頁面渡蜻,是notification等圈留用戶方法的強需求术吝。JLRoute提供了解析App link,并回調block的機制茸苇,很好的實現了這個功能排苍。

  • 閱讀和評論

  1. API以class method的形式提供:addRoute注冊回調blockrouteURL解析app link
  • singleton(static routeControllersMap)保證數據的唯一性学密。routeControllersMap管理app link scheme淘衙,每個scheme對應一個JLRoute類的實例。(若app僅注冊了一個app link腻暮,則僅維護一個global route)

  • JLRoute類維護包含多個JLRoutes_的列表彤守,JLRoute_類則具體存放用戶注冊block及其相關參數(如priority等)毯侦。在用戶解析app link后,查找合適的block予以執(zhí)行

  • 總結:
    routeControllersMap(singleton) -> JLRoute(對應具體scheme) -> JLRoutes_(管理回調block)

五具垫。pop

首發(fā)地址

  • 介紹
    iOS系統提供的UIView animation其實挺好用的侈离,配合CABasicAnimation對CALayer的動畫,大多數情況都盡夠用了筝蚕。選用pop卦碾,一來是因為其默認可以操作更多的UI property(比如color),二來也是其默認的彈簧效果實在配置得很賞心悅目起宽。


    (圖片來自pop在github的頁面

  • 閱讀和評論

  1. 底層的動畫支持洲胖,使用了CADisplayLink,提供了和屏幕刷新率同頻的回調燎含,以保證動畫的順滑(見POPAnimator)
  • 動畫曲線參數宾濒,保存在POPAnimation及其子類中,提供各式各樣的動畫效果

  • 比如屏箍,動畫某個參數X時绘梦,在CADisplayLink的回調函數中,POPAnimation子類計算該參數X在當前幀的數值:POPAnimator的applyAnimationTime赴魁,其中調用了定義在POPAnimationInternal.h中的關鍵函數:advanceTime卸奉,而關于實際UI property的變化所引起的UI變化,則實現在updateAnimatable中颖御。對于此lib所支持的可以動畫的UI property榄棵,系統定義了其pop_animatable_write_block(見POPAnimatableProperty中的POPStaticAnimatablePropertyState),此預設block完成UI的改變潘拱。

  • pop是用c++寫的喲

  • 總結:
    CADisplayLink提供timer疹鳄,POPAnimation計算當前幀的數值,POPAnimatableProperty定義了該lib中所支持的UI property的block回調芦岂,從而完成整套動畫效果瘪弓。

六。reactiveCocoa (FRP / MVVM)

首發(fā)地址

  • 介紹
    這東西值得花時間多寫一點禽最。

從方法上來看:

  • 函數式編程(Functional programming)源遠流長腺怯,其思路是將計算理解成數學函數,即函數輸出僅與函數輸入有關川无。比較常用的函數有:map, reduce, filter等
  • 響應式編程(Reactive programming)大約出現在Y2K呛占,其思路是將計算看作對連續(xù)數據流的響應。大體可以理解為事件驅動懦趋。
  • 函數響應式編程(Functional reactive programming / FRP)采兩家之長晾虑。FRP應該是近期的一種思潮和趨勢吧,reactiveCocoa即是以FRP為理念的編程方法在cocoa(iOS)上的實現

從結構上來看:

  1. 大約Y2K的時候,大牛Martin Fowler構思了一種新的模型:Presentation Model走贪。其定義為:Represent the state and behavior of the presentation independently of the GUI controls used in the interface佛猛,即,將圖形控件的狀態(tài)和行為獨立出來作為一個新的組件坠狡。這種建模方式將圖形控件進一步分拆解耦继找,能有效降低“富圖形界面”的開發(fā)和測試難度。
  • 后來微軟在開發(fā)WPF(Windows Presentation Foundation)時逃沿,參考了Presentation Model思路婴渡,提供了圖形控件(View)和其模型(ViewModel,即View的狀態(tài)和行為)間的邏輯支持凯亮。此結構被稱為MVVM(Model-View-ViewModel)边臼。
  • 在iOS的開發(fā)中,xcode project默認采用的是MVC結構假消。但是隨著界面元素的豐富和邏輯的復雜柠并,view controller變得越來越臃腫。因此MVVM的思路被借鑒過來富拗,即對view controller進行分拆臼予,將view的狀態(tài)和行為拆至新的ViewModel中。整個程序的結構由原來的Model-ViewController-View啃沪,變成Model-ViewModel-ViewController-View
  • reactiveCocoa可以提供View和ViewModel之間的DataBinding粘拾,從而方便的實現MVVM結構。

從歷史上來看:

  • 微軟的The Reactive Extensions (Rx)是對.Net庫的響應式編程的擴充创千,提供了異步的缰雇、基于事件的編程實現。

  • 也許是View和ViewModel之間的天然特性(事件表象與內在邏輯?)追驴,大家發(fā)現Rx與MVVM實乃天作之合械哟。

  • ReactiveCocoa是Rx在cocoa框架上的FRP實現。其為MVVM中的View和ViewModel間的邏輯提供了支持殿雪。

  • 閱讀和評論
    源代碼還沒看

七戒良。SDWebImage

首發(fā)地址

  • 介紹
    大多數CS類型的app,都少不得要用到服務端的圖片冠摄,對于圖片的下載和加載,最大的需求有三:1. 異步下載几缭;2. 緩存圖片河泳;3. 優(yōu)化顯示。SDWebImage可以比較好的完成這幾個需求年栓,是比較常用的開源庫之一拆挥。
    同時正因為這個庫的出名,已經有很多分析和介紹的文章了,比如:
  1. iOS異步圖片加載優(yōu)化與常用開源庫分析
  • SDWebImage 筆記

  • SDWebImage庫結構的簡單分析
    后面兩篇文章不能保證是原始鏈接纸兔,因為網上的轉載太多了惰瓜,并且都不帶轉載鏈接。而原作者似乎也并未對文章的原創(chuàng)性做更多的聲明汉矿。

  • 閱讀和評論
    由于本庫較為出名崎坊,相關介紹和分析文章已經很多了,我也并不能寫不出什么新花樣洲拇。最最關鍵的是:源代碼既不多奈揍,也不長。因此有興趣的同學還是自己去看源代碼吧赋续。

呃男翰,畢竟讀了代碼,還是稍稍寫一點吧:按我在一纽乱。介紹中的說法蛾绎,用戶的最大需求有三:1. 異步下載;2. 緩存圖片鸦列;3. 優(yōu)化顯示
因此對應到代碼中:

  1. 接口類SDWebImageManager租冠,提供核心API。(其含有下面兩個類的實例)
  • SDWebImageDownloader敛熬,完成需求1.異步下載
  • SDImageCache肺稀,完成2. 緩存圖片
  • 由UIImageView和UIButton的category,如UIImageView+WebCache应民,完成3. 優(yōu)化顯示

DONE

[TOC]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末话原,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子诲锹,更是在濱河造成了極大的恐慌繁仁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件归园,死亡現場離奇詭異黄虱,居然都是意外死亡,警方通過查閱死者的電腦和手機庸诱,發(fā)現死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門捻浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桥爽,你說我怎么就攤上這事朱灿。” “怎么了钠四?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵盗扒,是天一觀的道長。 經常有香客問我,道長侣灶,這世上最難降的妖魔是什么甸祭? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮褥影,結果婚禮上池户,老公的妹妹穿的比我還像新娘。我一直安慰自己伪阶,他們只是感情好煞檩,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栅贴,像睡著了一般斟湃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檐薯,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天凝赛,我揣著相機與錄音,去河邊找鬼坛缕。 笑死墓猎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的赚楚。 我是一名探鬼主播毙沾,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宠页!你這毒婦竟也來了左胞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤举户,失蹤者是張志新(化名)和其女友劉穎烤宙,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體俭嘁,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡躺枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了供填。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拐云。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖近她,靈堂內的尸體忽然破棺而出慨丐,到底是詐尸還是另有隱情,我是刑警寧澤泄私,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響晌端,放射性物質發(fā)生泄漏捅暴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一咧纠、第九天 我趴在偏房一處隱蔽的房頂上張望蓬痒。 院中可真熱鬧,春花似錦漆羔、人聲如沸梧奢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亲轨。三九已至,卻和暖如春鸟顺,著一層夾襖步出監(jiān)牢的瞬間惦蚊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工讯嫂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹦锋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓欧芽,卻偏偏與公主長得像莉掂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子千扔,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 關于“青梅竹馬” 突然覺得憎妙,真的過去好久了,大概有十年了吧昏鹃。但是尚氛,一向以記性差著稱的我竟會...
    一只幸福的小蝦米閱讀 296評論 2 2
  • 早上睜開眼,刷牙的時候打開網絡洞渤,打開手機阅嘶,快速刷刷微字輩的微信和微博。刷完牙载迄,把頭天晚上孩子換下的衣服扔進洗衣機讯柔,...
    舒航2018閱讀 340評論 0 0
  • 2017年7月17日, 開始心力飲食的第一天。 早餐护昧,在單位食堂解決魂迄,相對于平時主食只拿了很小的一塊玉米餅避開了...
    w_dahai閱讀 824評論 0 1