iOS晉級知識匯總(七)第三方庫

第三方庫

AFNetworking

iOS客戶端的第三方網(wǎng)絡(luò)框架汞窗,代碼地址

架構(gòu)圖

AFNetworking的架構(gòu)圖.png

AFURLSessionManager

  • 創(chuàng)建和管理NSURLSession、NSURLSessionTask
  • 實現(xiàn)NSURLSessionDelegate等協(xié)議的代理方法
  • 引入AFSecurityPolicy保證請求安全
  • 引入AFNetworkReachabilityManager監(jiān)控網(wǎng)絡(luò)狀態(tài)

類的關(guān)系

AFN類的關(guān)系.png

SDWebImageView

架構(gòu)圖

SDWebImage的架構(gòu)圖.png

緩存流程

SDWebImageView的緩存流程.png

Reactive Cocoa

函數(shù)響應(yīng)式編程框架,源代碼地址

函數(shù)式編程它的核心思想是前域,它是一種將程序看成是數(shù)學(xué)方法的求值幌羞、不會改變狀態(tài)娃属、不會產(chǎn)生副作用(后面我們馬上會談到)的編程方式

響應(yīng)式編程

RAC庫是否了解

  • RAC是一個函數(shù)式響應(yīng)編程
    • 信號和訂閱

信號

  • 核心類RACSignal 繼承于RACStream

    • 使用了抽象工廠玄呛、類簇設(shè)計模式,返回的對象都是抽象對象斜纪,實際上是通過不同的方法創(chuàng)建的具體對象也不同
    RAC信號類.png

如何理解信號

核心思想是RACSignal繼承RACStream贫母,RACStream的提供了方法:empty、return盒刚、bind腺劣、concat、zipWith這些都是抽象的函數(shù)因块,RACStream分類中有一些方法:map橘原、take、skip涡上、ignore靠柑、filter。吓懈。這些函數(shù)是對上述提供的抽象函數(shù)的不同組合邏輯。

什么是信號
信號代表一連串的狀態(tài)靡狞,在狀態(tài)改變時耻警,對應(yīng)的訂閱者RACSubscriber就會收到通知,執(zhí)行響應(yīng)的指令甸怕。

什么是信號.png
  • RACReturnSignal 比如說[RACSignal return:@3]這個調(diào)用的就是RACReturnSignal的return
    • 覆蓋RACStream中的return方法
    • 對傳遞進來的對象進行包裝把它返回給調(diào)用方甘穿,把OC對象封裝成一個信號返回給調(diào)用方
    • return返回的實例就是信號

訂閱

RACSubscriber訂閱者,訂閱的流程:

RAC如何使用訂閱.png

把傳進來的Block參數(shù)梢杭,作為這個信號的成員變量保存下來温兼,比如[nal subscribeNext:^(id _Nullable x) {}]

產(chǎn)生了RACSubscriber的類時候,在內(nèi)部持有一個成員變量武契,內(nèi)部的變量是didSubscribe的這個block募判,當(dāng)調(diào)用RACSignal 的方法的時候,實際上就是執(zhí)行內(nèi)部保存的block咒唆;

RAC訂閱的原理.png

例子分析:

RACSignal *nal = [RACSignal return:@3];
[nal subscribeNext:^(id  _Nullable x) {}];

RACSignal *nal = [RACSignal return:@3]分析

  • 首先分析[RACSignal return:@3]的方法届垫,我們打開源碼可以看到,是調(diào)用了RACReturnSignal的return方法。
+ (RACSignal *)return:(id)value {
    return [RACReturnSignal return:value];
}
  • 而RACReturnSignal的return方法主要工作是創(chuàng)建一個RACReturnSignal的對象全释,并將值賦值給這個對象装处。
RACReturnSignal *signal = [[self alloc] init];
signal->_value = value;
return signal;

[nal subscribeNext:^(id _Nullable x) {}]的分析

  • 1、當(dāng)RACSignal的實例對象調(diào)用了subscribeNext的方法浸船,該方法通過調(diào)用RACSubscriber的類方法subscriberWithNext得到RACSubscriber對象

  • 2妄迁、subscriberWithNext的方法內(nèi)部是將nextBlockblock保存到RACSubscriber對象當(dāng)中

  • 3、通過調(diào)用RACSubscriber的類方法subscriberWithNext得到RACSubscriber對象后李命,調(diào)用了RACSubscriber實例對象的subscribe方法

  • 4登淘、subscribe方法是RACReturnSignal中的subscribe方法,因為上面的return方法返回的是RACReturnSignal對象项戴。

  • 5形帮、subscribe中的方法實現(xiàn)

    - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
    NSCParameterAssert(subscriber != nil);
    //RACScheduler.subscriptionScheduler是一個單例槽惫,而schedule方法只是為了調(diào)用這個block
    return [RACScheduler.subscriptionScheduler schedule:^{
        [subscriber sendNext:self.value]; 
        [subscriber sendCompleted];
    }];
    }
    @implementation RACSubscriptionScheduler
        - (RACDisposable *)schedule:(void (^)(void))block {
        NSCParameterAssert(block != NULL);
    
        if (RACScheduler.currentScheduler == nil) return [self.backgroundScheduler schedule:block];
    
        block();//只是做了一個調(diào)用block
        return nil;
        }
    @end
    
    
  • 6、當(dāng)schedule的block方法調(diào)用的時候辩撑,調(diào)用了RACSubscriber實例對象的- (void)sendNext:(id)value方法界斜。

  • 7、最終在sendNext方法中調(diào)用了RACSubscriber實例對象中的nextBlock的block

    - (void)sendNext:(id)value {
    @synchronized (self) {
        void (^nextBlock)(id) = [self.next copy];
        if (nextBlock == nil) return;
    
        nextBlock(value);
    }
    }
    
  • 8合冀、上述代碼void (^nextBlock)(id) = [self.next copy];這個block恰好就是通過調(diào)用RACSubscriber的類方法subscriberWithNext得到RACSubscriber實例對象時各薇,保存到RACSubscriber實例對象的block

  • 9、最終的結(jié)果就是 [nal subscribeNext:^(id _Nullable x) {}]中的x就是RACSignal *nal = [RACSignal return:@3]中的3

AsyncDisPlayKit

提升iOS界面渲染性的一個框架,代碼地址

減輕主線程壓力君躺,把事情能放入到子線程的就放入到子線程峭判,主要分為三個方面:

  • layout 文本寬高計算、視圖布局計算
  • Rendering 文本渲染棕叫、圖片解碼林螃、圖形繪制
  • UIKit Objects 對象創(chuàng)建、對象調(diào)整俺泣、對象銷毀

ASDK實現(xiàn)原理

UIView作為CALyaer的一個delegate疗认,CALyaer作為UIView的一個成員變量負責(zé)UIView的展示工作,ASDK在此之上封裝了一個NSNode類伏钠,而這個類當(dāng)中會有一個.view或者一個成員變量横漏,可以生成一個view,同時每一個uiview都有一個.node的一個屬性可以獲取到它所對應(yīng)的節(jié)點熟掂。

UIView缎浇、CALayer和NSNode、UIView的區(qū)別是赴肚?
NSNode素跺、UIView中的NSNode是可以放入到后臺線程去處理的。是線程安全的尊蚁。
而UIView和CALayer包括UIKit的內(nèi)容都是在主線程上做的亡笑。

NSNode對UIView進行了一次包裝,包括文本寬高計算横朋、視圖布局計算仑乌、文本渲染、圖片解碼琴锭、徒刑繪制晰甚、對象的創(chuàng)建、對象調(diào)整决帖、對象銷毀厕九,通過操作NSNode來實現(xiàn),還可以放入到后臺執(zhí)行地回。

總結(jié):

  • 針對ASNode的修改和提交扁远,會對其進行封裝并提交到一個全局容器中去俊鱼。
    • 對UIView的修改都落地到NSNode的修改, 模仿系統(tǒng)CAAnimation提交CALayer的setNeedsDisplay這種形式把對NSNode的修改也會提交到全局容器當(dāng)中
  • ASDK在Runllop中注冊了一個Observer
  • 當(dāng)RunLoop進入休眠前,ASDK執(zhí)行該loop內(nèi)提交的所有任務(wù)畅买。

面試題

AFNetworking的整體結(jié)構(gòu)是什么并闲?

繪畫模塊、網(wǎng)絡(luò)監(jiān)聽模塊谷羞、安全模塊帝火,核心類是AFURLSessionManager

SDWebImage框架是怎么樣加載圖片的?

查找內(nèi)存湃缎、在查找磁盤犀填、都沒有的情況下去網(wǎng)路下載,
內(nèi)存的設(shè)計是什么嗓违?

RAC的信號訂閱是什么意思九巡,我們該怎么樣去理解?

信號是一連串的狀態(tài)的抽象蹂季,訂閱信號就是通過RCASubscriber來實現(xiàn)比庄,傳遞過去的block作為成員變量保存下來,然后RCASubscriber在具體的去調(diào)用`sentNext這個方法來執(zhí)行這個block乏盐?

ASDK的實現(xiàn)原理?

封裝一個NSNode節(jié)點制恍,對于視圖的屬性設(shè)置都轉(zhuǎn)化成NSNode的設(shè)置而這一部分又可以放入到后臺線程線去實現(xiàn)父能,然后我們在合適的時機,也就是在RunLoop結(jié)束的時候接收一個通知净神,提取全局容器當(dāng)中的對應(yīng)的NSNode然后在一次性設(shè)置UIView何吝,這個就是ASDK的實現(xiàn)原理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹃唯,一起剝皮案震驚了整個濱河市爱榕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坡慌,老刑警劉巖黔酥,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洪橘,居然都是意外死亡跪者,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門熄求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渣玲,“玉大人,你說我怎么就攤上這事弟晚⊥埽” “怎么了逾苫?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枚钓。 經(jīng)常有香客問我铅搓,道長,這世上最難降的妖魔是什么秘噪? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任狸吞,我火速辦了婚禮,結(jié)果婚禮上指煎,老公的妹妹穿的比我還像新娘蹋偏。我一直安慰自己,他們只是感情好至壤,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布威始。 她就那樣靜靜地躺著,像睡著了一般像街。 火紅的嫁衣襯著肌膚如雪黎棠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天镰绎,我揣著相機與錄音脓斩,去河邊找鬼。 笑死畴栖,一個胖子當(dāng)著我的面吹牛随静,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吗讶,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼燎猛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了照皆?” 一聲冷哼從身側(cè)響起重绷,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜毁,沒想到半個月后昭卓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瘟滨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年葬凳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片室奏。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡火焰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胧沫,到底是詐尸還是另有隱情昌简,我是刑警寧澤占业,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纯赎,受9級特大地震影響谦疾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犬金,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一念恍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晚顷,春花似錦峰伙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至栓袖,卻和暖如春匣摘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裹刮。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工音榜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧弃。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓囊咏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塔橡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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