第三方框架学习—YYKit

偶然间看到YYKit,Google一下,我的天啊!漫天的赞叹声,再打开源代码一看,感觉自己没有敲过代码,决心好好整理自己的心情,遂打开源码好好学习一番。

** ibireme**和YYKit

可以看一下唐巧对ibireme的采访
搜索一下ibireme的微博
简言之,渴望成为iOS大牛的新人,只有两条捷径,一是大量地阅读优秀项目的源代码,另一个就是自己动手实践来尝试。

YYKit

YYKit 是一组庞大、功能丰富的 iOS 组件。
为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。为了方便其他开发者使用,我从中拆分出以下独立组件:

  • YYModel — 高性能的 iOS JSON 模型框架。
  • YYCache — 高性能的 iOS 缓存框架。
  • YYImage — 功能强大的 iOS 图像框架。
  • YYWebImage — 高性能的 iOS 异步图像加载框架。
  • YYText — 功能强大的 iOS 富文本框架。
  • YYKeyboardManager — iOS 键盘监听管理工具。
  • YYDispatchQueuePool — iOS 全局并发队列管理工具。
  • YYAsyncLayer — iOS 异步绘制与显示的工具。
  • YYCategories — 功能丰富的 Category 类型工具库。

YYModel的学习

iOS开发总会用到各种JSON模型转换库,本人最常用的MJExtension(小码哥出品),转换效率很高,使用也比较简单,只要前后台约定好,json直接就转成了model。另外还有JSONModel,Mantle,FastEasyMapping,Manually等等。关于这几个库的测评,可以点击ibireme的iOS JSON 模型转换库评测
《iOS JSON 模型转换库评测》
本文中ABCDE表示等级,A为最佳,E为最差(仅为个人学习用)

性能 容错性 功能 侵入性
Mantle E B 会进行对象类型检查 A 可定制性最高 B 需要 Model 继承自某个基类,灵活性稍差,但功能丰富
JSONModel C 和 MJExtension 差不多,Mantle 性能高 D 没有对错误类型的检测,没有对 App 的保护 B 使用比较简单,但功能相对 Mantle 稍弱 B 需要 Model 继承自某个基类,灵活性稍差,但功能丰富
MJExtension C 和JSONModel 差不多,Mantle 性能高 C 对部分对象进行自动转换 B 使用比较简单,但功能相对 Mantle 稍弱 A- Category 方式来实现,添加了一些没有前缀的方法,易引起冲突
FastEasyMapping B 较快 E 没有自动转换的机制 C 功能最少,使用也不算方便 C 采用工具类来实现,使用灵活,但不方便
YYModel A 快,接近手写代码的效率 A 会进行对象类型检查 B 使用比较简单,但功能相对 Mantle 稍弱 A Category 方式来实现

附录:原文中关于YYModel的几个优化tips不错,大家可以学习一下!

  1. 缓存
    Model JSON 转换过程中需要很多类的元数据,如果数据足够小,则全部缓存到内存中。
  1. 查表
    当遇到多项选择的条件时,要尽量使用查表法实现,比如 switch/case,C Array,如果查表条件是对象,则可以用 NSDictionary 来实现。
  1. 避免 KVC
    Key-Value Coding 使用起来非常方便,但性能上要差于直接调用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能会有较大提升。
  1. 避免 Getter/Setter 调用
    如果能直接访问 ivar,则尽量使用 ivar 而不要使用 Getter/Setter 这样也能节省一部分开销。
  1. 避免多余的内存管理方法
    在 ARC 条件下,默认声明的对象是 __strong 类型的,赋值时有可能会产生 retain/release 调用,如果一个变量在其生命周期内不会被释放,则使用 __unsafe_unretained 会节省很大的开销。
    访问具有 __weak 属性的变量时,实际上会调用 objc_loadWeak() 和 objc_storeWeak() 来完成,这也会带来很大的开销,所以要避免使用 __weak 属性。
    创建和使用对象时,要尽量避免对象进入 autoreleasepool,以避免额外的资源开销。
  1. 遍历容器类时,选择更高效的方法
    相对于 Foundation 的方法来说,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法来遍历容器类能带来不少性能提升,但代码写起来会非常麻烦。
  1. 尽量用纯 C 函数、内联函数
    使用纯 C 函数可以避免 ObjC 的消息发送带来的开销。如果 C 函数比较小,使用 inline 可以避免一部分压栈弹栈等函数调用的开销。
  1. 减少遍历的循环次数
    在 JSON 和 Model 转换前,Model 的属性个数和 JSON 的属性个数都是已知的,这时选择数量较少的那一方进行遍历,会节省很多时间。

YYModel的特性

高性能: 模型转换性能接近手写解析代码。
自动类型转换: 对象类型可以自动转换,详情见下方表格。
类型安全: 转换过程中,所有的数据类型都会被检测一遍,以保证类型安全,避免崩溃问题。
无侵入性: 模型无需继承自其他基类。
轻量: 该框架只有 5 个文件 (包括.h文件)。
文档和单元测试: 文档覆盖率100%, 代码覆盖率99.6%。

YYModel的代码

字典转模型

@interface HelpModel : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *html;
@property(nonatomic,copy)NSString *ID;
@end

Paste_Image.png

ps :导入NSArray分类

在VC中调用

Paste_Image.png

打印出的部分结果


Paste_Image.png

归档解档

直接调用两个方法


Paste_Image.png

数据校验与自定义转换

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,614评论 4 59
  • 二月里,杨柳迷离杏花雨,笛声吹进春色里。晓来终成姣杏妆,踏遍陌上春如许。 三月里,歌尽桃花人未休,晨起妆成又成酒。...
    深巷梨花阅读 295评论 0 1
  • 完蛋了,我得了跟儿子的分离焦虑,伤心。儿子竟然哭着跟姥姥走不在家,是因为给的太多,还是因为给的爱太少,敏感气质的孩...
    王晓懒阅读 125评论 0 0
  • 在晚上浏览网页的看到一个统计,统计中说人一生最大的遗憾是什么,结果是90%以上的是后悔自己年轻时不够努力,以致于自...
    天涯落花零阅读 647评论 0 0
  • 至洁之物常以为浊; 至方正之物常失棱角; 至大之声常无声无息; 至情之极常无言以表。 ​​​ 晚安,我的Leslie❤️
    草乙君阅读 174评论 0 0