第十二章娃惯、第三方庫相關(guān)

一跷乐、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ā)送者金度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市严沥,隨后出現(xiàn)的幾起案子猜极,更是在濱河造成了極大的恐慌,老刑警劉巖消玄,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟伏,死亡現(xiàn)場離奇詭異,居然都是意外死亡翩瓜,警方通過查閱死者的電腦和手機受扳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門兔跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勘高,“玉大人,你說我怎么就攤上這事坟桅∠嗦” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵桦卒,是天一觀的道長。 經(jīng)常有香客問我匿又,道長方灾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮裕偿,結(jié)果婚禮上洞慎,老公的妹妹穿的比我還像新娘。我一直安慰自己嘿棘,他們只是感情好劲腿,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟妙,像睡著了一般焦人。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上重父,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天花椭,我揣著相機與錄音,去河邊找鬼房午。 笑死矿辽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郭厌。 我是一名探鬼主播袋倔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼折柠!你這毒婦竟也來了宾娜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤液走,失蹤者是張志新(化名)和其女友劉穎碳默,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘眶,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嘱根,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巷懈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片该抒。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顶燕,靈堂內(nèi)的尸體忽然破棺而出凑保,到底是詐尸還是另有隱情,我是刑警寧澤涌攻,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布欧引,位于F島的核電站,受9級特大地震影響恳谎,放射性物質(zhì)發(fā)生泄漏芝此。R本人自食惡果不足惜憋肖,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婚苹。 院中可真熱鬧岸更,春花似錦、人聲如沸膊升。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓译。三九已至评肆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間责循,已是汗流浹背糟港。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留院仿,地道東北人秸抚。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像歹垫,于是被迫代替她去往敵國和親剥汤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時排惨,會觸發(fā)此異常吭敢。 O...
    我想起個好名字閱讀 5,189評論 0 9
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,815評論 0 5
  • SDWebImage 圖片下載緩存框架 常用方法及原理 常見面試題: SDWebImage的最大并發(fā)數(shù)是多少暮芭? _...
    toro宇閱讀 1,989評論 0 4
  • 店鋪淘客就是自己開一個淘寶店鋪鹿驼, 淘寶上面有很多爆款的商品, 他們利用商品的返傭以最快的速度最推廣辕宏,我們就是利用一...
    風(fēng)吹過_b1d5閱讀 214評論 0 0