一跷乐、AFNetworking框架分析
- AFURLSessionManager、AFHTTPSessionManager
AFHTTPSessionManager
又是繼承于AFURLSessionManager
趾浅,進行了封裝愕提。主要負(fù)責(zé)網(wǎng)絡(luò)請求通訊。
- AFURLRequestSerialization
主要用于網(wǎng)絡(luò)請求之前的操作配置皿哨,負(fù)責(zé)配置網(wǎng)絡(luò)請求的請求頭部浅侨、序列化請求參數(shù)。
- AFURLResponseSerialization
主要用于網(wǎng)絡(luò)請求之后的數(shù)據(jù)處理证膨,針對不同的數(shù)據(jù)進行處理如输,比如JSON、XML央勒、plist不见、圖片格式等數(shù)據(jù)
。
- AFSecurityPolicy
主要用于HTTPS
環(huán)境下的認(rèn)證安全請求通訊崔步。如果是通過CA認(rèn)證過的HTTPS
訪問地址稳吮,使用AFN時只需要拼接上https://
即可,AFN的網(wǎng)絡(luò)請求配置中默認(rèn)使用CA認(rèn)證訪問HTTPS
地址井濒;若是自簽的證書時灶似,則需要當(dāng)前類用于進行認(rèn)證。
- AFNetworkReachabilityManager
用于網(wǎng)絡(luò)狀態(tài)的監(jiān)聽瑞你,判斷是否有網(wǎng)絡(luò)酪惭,以及判斷網(wǎng)絡(luò)連接類型,比如蜂窩網(wǎng)絡(luò)或WiFi環(huán)境捏悬。但當(dāng)前類無法判斷當(dāng)前環(huán)境能否訪問服務(wù)器服務(wù)撞蚕。其原理是利用主機的數(shù)據(jù)包發(fā)送。
二过牙、SDWebImage分析
- 圖片緩存在那個目錄下甥厦?
緩存的方法在SDImageCache.m里面纺铭,圖片默認(rèn)緩存路徑~/Library/Caches/default/com.hackemist.SDWebImageCache.default
- 圖片下載最大并發(fā)數(shù)和超時時間?
#import "SDWebImageDownloader.h"
//下載最大并發(fā)數(shù)
_downloadQueue.maxConcurrentOperationCount = 6;
//下載超時時間
_downloadTimeout = 15.0;
- 圖片是怎樣命名的刀疙?
#import "SDImageCache.h"
//寫入緩存用url做key
NSUInteger cost = SDCacheCostForImage(image);
[self.memCache setObject:image forKey:key cost:cost];
//寫入磁盤需要將url進行md5作為圖片的key,防止文件名稱過長
- (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key {
const char *str = key.UTF8String;
if (str == NULL) {
str = "";
}
unsigned char r[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), r);
NSURL *keyURL = [NSURL URLWithString:key];
NSString *ext = keyURL ? keyURL.pathExtension : key.pathExtension;
NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%@",
r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10],
r[11], r[12], r[13], r[14], r[15], ext.length == 0 ? @"" : [NSString stringWithFormat:@".%@", ext]];
return filename;
}
- 如何識別圖片類型舶赔?
#import "NSData+ImageContentType.h"
//通過NSData的第一個字符判斷圖片類型
+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
- 查找到的圖片可以知道圖片來源嗎?
typedef NS_ENUM(NSInteger, SDImageCacheType) { /**
* 從網(wǎng)上下載
*/ SDImageCacheTypeNone, /**
* 從磁盤獲得
*/ SDImageCacheTypeDisk, /**
* 從內(nèi)存獲得
*/ SDImageCacheTypeMemory
};
- 所有下載的圖片都將被寫入緩存谦秧?磁盤呢竟纳?何時緩存的?
其一是下載成功后疚鲤、自動保存锥累。或者開發(fā)者通過代理處理圖片并返回后緩存
其二是當(dāng)緩存中沒有集歇、但是從硬盤中查詢到了圖片,在緩存上進行緩存桶略。
//磁盤不是強制寫入。從枚舉SDWebImageOptions可見
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { /**
* 禁用磁盤緩存
*/ SDWebImageCacheMemoryOnly = 1 << 2,
}
- 磁盤緩存的時長诲宇?清理操作的時間點际歼?
默認(rèn)一周清理一次;首先姑蓝、通過時間進行清理鹅心。(最后修改時間>一周);然后纺荧、根據(jù)占據(jù)內(nèi)存大小進行清理旭愧。(如果占據(jù)內(nèi)存大于上限、則按時間排序虐秋、刪除到上限的1/2榕茧。)
- 下載圖片的URL必須是NSURL么?
不是客给,有容錯處理。
- 讀取緩存以及讀取磁盤的時候如何保證線程安全肢簿?
讀取緩存:
讀取緩存的時候是在主線程進行靶剑。由于使用NSCache
進行存儲、所以不需要擔(dān)心單個value
對象的線程安全池充。
讀取磁盤:
磁盤的讀取雖然創(chuàng)建了一個NSOperation
對象桩引,但據(jù)我所見這個對象只是用來標(biāo)記該操作是否被取消、以及取消之后不再讀取磁盤文件的作用收夸。
真正的磁盤緩存是在另一個IO專屬線程中的一個串行隊列下進行的坑匠。
如果你搜索self.ioQueue還能發(fā)現(xiàn)、不只是讀取磁盤內(nèi)容卧惜。
包括刪除厘灼、寫入等所有磁盤內(nèi)容都是在這個IO線程進行夹纫、以保證線程安全。
但計算大小设凹、獲取文件總數(shù)等操作舰讹。則是在主線程進行。
AsyncDisplayKit理解
其主要目的就只解決App使用卡頓問題闪朱。
- 分析原因部分:
盡管從iPhone4S(A5)開始CPU已經(jīng)采用多核月匣,然而對于大多數(shù)app來說,多線程協(xié)作并沒有被充分利用奋姿。換句話說锄开,在app卡頓(主線程所占用的核心滿負(fù)荷)時,往往CPU的其他核心幾乎無事可做称诗。一般情況下萍悴,由于主線程承擔(dān)了絕大部分的工作,如果能把主線程的任務(wù)轉(zhuǎn)移一部給其他線程進行異步處理粪狼,就可以馬上享受到并發(fā)帶來的性能提升退腥。這應(yīng)該也是AsyncDisplayKit
得名的原因之一。
UIKit
的單線程設(shè)計也有一定的歷史原因再榄。早在十年前iOS SDK
剛問世的時候狡刘,mobileSDK
還是一個非常新的概念,更沒有移動多核CPU的存在困鸥,因此當(dāng)時的重點是簡單可靠嗅蔬,大多數(shù)API都沒有支持相對復(fù)雜的異步操作。時至今日疾就,如果要完全重構(gòu)UIKit
使之支持異步繪制和布局澜术,對于兼容已有海量的app,難度可想而知猬腰。在iOS10
中雖然對UICollectionView/UITableView
做了一定的預(yù)加載優(yōu)化(WWDC2016Session219)鸟废,然而并沒有從根本上解決主線程布局和渲染的問題。
主要處理的問題:
UILayout
:文本計算姑荷、視圖布局計算
Rendering
:文本渲染盒延、圖片解碼、圖形繪制
UIKit Objects
:對象的創(chuàng)建鼠冕、調(diào)整添寺、銷毀基本原理:
針對ASNode
的修改和提交,會對其進行封裝并提交到一個全局容器中
ASDK
也在RunLoop
中注冊了一個Observer
當(dāng)RunLoop
進入休眠前懈费,ASDK
執(zhí)行該Loop內(nèi)提交的所有任務(wù)
三计露、ReactiveCocoa理解
ReactiveCocoa是一個基于函數(shù)響應(yīng)式編程思想(Function Reactive Programming,簡稱FRP)
的框架。由幾個重要的部分組成票罐,如下:
1叉趣、信號:例如RACSignal
,可以被訂閱胶坠,訂閱后進行邏輯處理或者數(shù)據(jù)傳遞君账。
2、訂閱者:例如RACSubscriber
沈善,表示訂閱者的意思乡数。用于訂閱和發(fā)送數(shù)據(jù)。它是一個協(xié)議闻牡,由具體的類實現(xiàn)净赴。
3、清理者:例如RACDisposable罩润,用于取消或者清理訂閱者的資源玖翅。
4、RACSubject:可以當(dāng)成一個信號割以,也可以充當(dāng)信號發(fā)送者金度。