第三方框架学习—YYKit

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

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

  1. 缓存
    Model JSON 转换过程中需要很多类的元数据,如果数据足够小,则全部缓存到内存中。

  2. 查表
    当遇到多项选择的条件时,要尽量使用查表法实现,比如 switch/case,C Array,如果查表条件是对象,则可以用 NSDictionary 来实现。

  3. 避免 KVC
    Key-Value Coding 使用起来非常方便,但性能上要差于直接调用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能会有较大提升。

  4. 避免 Getter/Setter 调用
    如果能直接访问 ivar,则尽量使用 ivar 而不要使用 Getter/Setter 这样也能节省一部分开销。

  5. 避免多余的内存管理方法
    在 ARC 条件下,默认声明的对象是 strong 类型的,赋值时有可能会产生 retain/release 调用,如果一个变量在其生命周期内不会被释放,则使用 unsafe_unretained 会节省很大的开销。
    访问具有 weak 属性的变量时,实际上会调用 objc_loadWeak() 和 objc_storeWeak() 来完成,这也会带来很大的开销,所以要避免使用 weak 属性。
    创建和使用对象时,要尽量避免对象进入 autoreleasepool,以避免额外的资源开销。

  6. 遍历容器类时,选择更高效的方法
    相对于 Foundation 的方法来说,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法来遍历容器类能带来不少性能提升,但代码写起来会非常麻烦。

  7. 尽量用纯 C 函数、内联函数
    使用纯 C 函数可以避免 ObjC 的消息发送带来的开销。如果 C 函数比较小,使用 inline 可以避免一部分压栈弹栈等函数调用的开销。

  8. 减少遍历的循环次数
    在 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
数据校验与自定义转换


文/Iris_Fighting(简书作者)
原文链接:http://www.jianshu.com/p/514ffb83868d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值