iOS 第三方源码解析

SDWebImage

首先SDWebImage是我们经常用的一个加载网络图片的库,内部很好的处理了缓存、下载、解码之间关系,使得在性能上有很大的提升。
SDWebImage大致可以分为5大块:
我们拿UIImageView来说,入口就是

[imageView sd_setImageWithURL:nil]
  1. wrap结构:充分使用了单一原则和接口隔离的设计原则,UIImageView跟UIButton等空间区分开来,互相不干扰。但是他们都会走到UIView的 sd_internalSetImageWithURL方法,在这里处理相关逻辑。
  2. 管理:使用SDImageManage类来调节缓存跟回调之间的关系。当接收到此URL,会先进行取消下载,避免多次下载。作用就是调度缓存下载外层结构之间的关系回调
  3. 缓存:然后sd_queryCacheOperationForKey内部寻找缓存,先根据NSCache在内存中查找是否存在缓存,然后在磁盘中查找缓存,这里有个小细节就是,如果在磁盘中查到缓存就将缓存存入内存中去,如果两个都没有找到需要进行下载。
  4. 下载:使用SDImageOperationQuque来进行管理下载,创建一个任务,启动section进行下载,通知管理类,来处理图片。
  5. 解码:网络图片一般会偏大,对于我们的图片渲染性能来说是个很大的损失,所以这里讲图片进行解码操作,生成位图返回新图片,这样在GPU渲染的时候可以直接使用位图来进行渲染,极大的提升性能。
    然后异步将图片存入缓存之中去。清除缓存的时候时候会将默认1周的图片进行清理,避免浪费空间。

总结:通过源码学到了作者的编程思想,设计原则体现的淋漓尽致,将类于类之间充分的解耦,枚举使用位移的方式,节省内存开销。下载使用Operation队列来管理下载类,对自己以后做下载相关需求的时候很大的提升,缓存的思维,内存报警之后的处理。图片的解码了解到性能上的优化相关的操作等等。

YYCache

YYCache是我们通常使用的缓存类,当我们做页面缓存的时候是一个非常不错的选择。
缓存分为2类,一种是内存缓存,一种是磁盘缓存

  1. 内存缓存:YYMeroryCache
    适用于体积小,速度快。内部实现了LRU(缓存淘汰算法),使用双向链表来存储。
    LRU的实现:淘汰访问频率低的节点,当存入一个新节点就放置头部,放存入一个已经存在的节点就把当前节点拿出来放置头部。删除的时候从链表尾端开始删除。
    链表采用C语言的字典来实现,节点内部元素有parentNode、childNode,缓存开销等变量。采用pthread_mutex_lock锁的机制来处理资源访问的时候线程安全。
  2. 磁盘缓存: YYDiskCache
    适用于体积大,相对来说速度慢。
    使用YYKVStore来管理对文件的操作,磁盘缓存分2种,一种是数据库存储,一种是数据库/文件混合存储
    当资源>20KB的时候会采用混合存储,此时数据的元数据存在sqlite3数据库中,数据存在文件系统中去。采用信号量对资源进行加锁。
    总结:YYCache的设计流程:先内存后磁盘,双重实现来对数据的缓存,LRU算法,双向链表的使用。
    磁盘缓存使用数据库跟文件混合存储,性能上极大的提升。
    使用pthread_metux_lock和信号量分别的不同的方式进行线程安全的维护。他们的区别在于信号量在等待的时候性能优于pthread_metux_lock,等待的时候不消耗CPU。而且信号量在处理线程等待的时候会对线程进行顺序进行,而pthread_metux_lock等待的时候是无序的。

Masorny

Masorny是一个可以对屏幕进行适配一个轻量级的布局架构,他是封装了系统的AutoLayout来实现的。内部使用了链式编程的风格,点语法,可以循环式调用自身,增加了diamante的可读性,优化了代码风格。MASConstraintMaker是一个工厂类。
总结:链式编程思想,使用点语法,隐式block回调。

WebViewJavaScriptBridge

WebViewJavaScriptBridge是H5跟OC交互的一个常用的库。

  1. 初始化:在OC端初始化bridge,H5端写入setupJavascript方法,创建一个iframe标签,设置scr为“https://bridge_loaded”,注入JS脚本,webview的代理方法webView:decidePolicyForNavgationAction:...方法可以检测到。
  2. OC调用H5:调用callHandle方法,base调用sendData方法,封装一个唯一的消息id,存在本地。接着调用,将消息json序列化,webview注入JS,执行H5中对应的handleName的方法回调。
    3.H5调用OC:H5端调用callHandle,本地调用registerHandle,将handleName存入字典。H5调用callHandle,触发注入的JS代码中的callHandle方法,内部调用__doSend方法,将iframe的scr重新改写,这时webView的webview:decidePolicyForNavgationAction代理方法,根据handleName找到存储在本地的messageQueue的block,执行block,调用OC的方法。
    总结:OC通过webview执行JS代码,来通知H5,触发回调。H5通过iframe标签设置scr,然后webView的decidePolicyForNavgationAction方法接收到响应,触发回调方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266