第三方庫
AFNetworking
iOS客戶端的第三方網(wǎng)絡(luò)框架汞窗,代碼地址
架構(gòu)圖
AFURLSessionManager
- 創(chuàng)建和管理NSURLSession、NSURLSessionTask
- 實現(xiàn)NSURLSessionDelegate等協(xié)議的代理方法
- 引入AFSecurityPolicy保證請求安全
- 引入AFNetworkReachabilityManager監(jiān)控網(wǎng)絡(luò)狀態(tài)
類的關(guān)系
SDWebImageView
架構(gòu)圖
緩存流程
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)的指令甸怕。
- RACReturnSignal 比如說
[RACSignal return:@3]
這個調(diào)用的就是RACReturnSignal的return- 覆蓋RACStream中的return方法
- 對傳遞進來的對象進行包裝把它返回給調(diào)用方甘穿,把OC對象封裝成一個信號返回給調(diào)用方
- return返回的實例就是信號
訂閱
RACSubscriber訂閱者,訂閱的流程:
把傳進來的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咒唆;
例子分析:
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)部是將nextBlock
block保存到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
實例對象的block9、最終的結(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)原理。