iOS 关于第三方库的选择

  由于公司需要,对,仍然是由于公司需要,最近调研了一遍常用的第三方库,按功能分类,综合 GitHub 上 Star 的数量,最近更新的时间,百度、谷歌搜索(把这个列入参考的目的是考虑到开发过程中可能遇到种种问题,需要面向搜索编程,检索出的条目越多就越容易解决问题,另一方面也证明有很多人使用。)的条目数量,和实际使用体验得出比较适合稳定持续开发使用的框架。

一、Log 输出打印调研

1.CocoaLumberjack(OC)

Star 数:10,467
最近一次更新时间:29 天以前
谷歌搜索词条结果:32,000
百度搜索词条结果:5,000
是否也支持 Swift:是
是否有中文文档:否

详细功能:

  1. 支持日志打印到Xcode控制台,打印到mac的console程序、打印到文件
  2. 日志功能支持关闭和打开,支持Error、Warning、Info、Debug、Verbose、All日志等级
  3. 支持基于DDLogFormatter协议自定义日志格式和继承DDAbstractLogger和协议DDLogger自定义logger
  4. 可将日志打印上传到服务器
  5. 基于多线程、GCD、运行时态等

使用体验:非常容易上手。导入需要使用的类,pod install 就可直接运行。demo 可直接运行,自建工程导入框架也都流畅运行。

2.NSLogger(OC)

Star 数:4,313
最近一次更新时间:三个月前
谷歌搜索词条结果:7,490
百度搜索词条结果:7,880
是否也支持 Swift:是
是否有中文文档:否

详细功能:

  1. 使用桌面应用程序查看日志
  2. 可以从设备或模拟器发送日志
  3. 接受来自本地网络客户端(使用Bonjour)或直接通过Internet连接的远程客户端的连接
  4. 在线(运行并连接到NSLogger的应用程序)和脱机(保存的日志)日志查看
  5. 缓冲内存或文件中的所有跟踪,在获取连接时将其发送给查看器
  6. 定义日志域(应用程序,视图,模型,控制器,网络……)和重要性级别(错误,警告,调试,噪音…)
  7. 使用regexp为日志消息着色
  8. 记录图像或原始二进制数据
  9. 安全日志记录(默认情况下连接使用SSL)
  10. 高级日志过滤选项
  11. 保存查看器日志以便共享和/或稍后查看它们
  12. 将日志导出到文本文件
  13. 打开从未直接连接到日志查看器的客户端应用程序返回的原始缓冲跟踪文件

使用体验:demo 无法正常运行,文档描写不清晰。自建工程导入框架按照文档实现方法,报错。

3.SwiftyBeaver (Swift)

Star 数:3,711
最近一次更新时间:两个月以前
谷歌搜索词条结果:13,300
百度搜索词条结果:62,800
是否有中文文档:否

详细功能:

  1. log 输出到Xcode控制台 或 输出到文件
  2. 添加 自定义日志目标 处理程序以登录Loggly,Redis等。
  3. 将带有端到端AES256加密的日志发送到SwiftyBeaver Mac App
  4. 彩色输出 到日志文件等
  5. 使用 自己的串行后台队列/线程 以获得出色的性能
  6. 低于设定的最小值的日志级别不会执行,以获得更好的发布性能
  7. 使用多个日志记录目标和设置,即使是相同类型
  8. 完全可定制的 日志格式
  9. 强大的过滤器
  10. 使用 log.debug(“foo”) 语法
  11. 非常详细的日志记录(可选):
    • 时间(精确到微秒)
    • 水平(颜色输出)
    • 线程名称 (如果不是主线程)
    • 文件名,功能和行
    • 消息(可以是字符串或任何类型的变量)

使用体验:有一定门槛,但上手后操作非常简单。swift 上测试成功,oc 有报错问题。有配套软件,可接收来自 App 端打印的数据,配置 App id 和 App key,免费版可保存数据云端一小时,收费版七天起。demo 无法直接运行,自建工程导入框架可流畅运行。

4.GodEye (Swift)

Star 数:3,102
最近一次更新时间:三个月前(readme.md),一年前(其他)
谷歌搜索词条结果:59,800
百度搜索词条结果:81,900
是否有中文文档:是

详细功能:

  1. 监控日志并区分日志类型.
  2. 监控崩溃, 包括Uncatched Exception和Signal崩溃.
  3. 监控网络, 包括请求和响应的所有信息.
  4. 监控卡顿, 并告诉你卡顿时候的所有线程的堆栈.
  5. 监控内存泄露, 告诉你泄露的对象的类名.
  6. 提供一个可以自定义指令和输出的控制台.
  7. 监控系统和应用自身的CPU使用率.
  8. 监控系统与应用自身的内存使用率.
  9. 监控帧率FPS.
  10. 监控系统和应用自身的网络流量.
  11. 提供一个文件浏览器可用于查看沙盒,.app 以及系统根目录的文件.
  12. 运行时自定义设置

使用体验:demo 无法正常运行,导入后需要配置参数很多,尝试两次后仍旧无法运行后放弃。这个库的作者出了一本书,这个库大概为了宣传书籍而附带出的。

5.结论:推荐使用 CocoaLumberjack。

二、网络请求调研(包含缓存数据的存储)

1.AFNetworking

Star 数:31,362
最近一次更新时间:17 天以前
谷歌搜索词条结果:622,000
百度搜索词条结果:3,510,000
是否也支持 Swift:是
是否有中文文档:否

详细功能:

  1. 原有基础urlsesson上封装了一层,在传参方面更灵活,
  2. 回调更友好,
  3. 支持返回数据序列化
  4. 支持文件上传,断点下载,
  5. 自带多线程,防死锁
  6. 处理了Https证书流程,节省移动端开发
  7. 支持网络状态判断

使用体验:简单易用,流畅。因为过往项目使用到过这个第三方库,所以就没有使用 Demo 测试框架。

2.YTKNetwork(基于 AFNetworking)

Star 数:5,439
最近一次更新时间:11 个月以前
谷歌搜索词条结果:11,000
百度搜索词条结果:343,000
是否也支持 Swift:是
是否有中文文档:是

详细功能:

  1. 支持按时间缓存网络请求内容
  2. 支持按版本号缓存网络请求内容
  3. 支持统一设置服务器和 CDN 的地址
  4. 支持检查返回 JSON 内容的合法性
  5. 支持文件的断点续传
  6. 支持 block 和 delegate 两种模式的回调方式
  7. 支持批量的网络请求发送,并统一设置它们的回调(实现在 YTKBatchRequest 类中)
  8. 支持方便地设置有相互依赖的网络请求的发送,例如:发送请求 A,根据请求 A 的结果,选择性的发送请求 B 和 C,再根据 B 和 C 的结果,选择性的发送请求 D。(实现在 YTKChainRequest 类中)
  9. 支持网络请求 URL 的 filter,可以统一为网络请求加上一些参数,或者修改一些路径。
  10. 定义了一套插件机制,可以很方便地为 YTKNetwork 增加功能。猿题库官方现在提供了一个插件,可以在某些网络请求发起时,在界面上显示“正在加载”的 HUD。

使用体验:因为公司项目使用到过这个第三方库,所以就没有使用 Demo 测试框架。

3.Alamofire(AFNetworking 同作者)(swift)

Star 数:28,574
最近一次更新时间:22 天以前
谷歌搜索词条结果:304,000
百度搜索词条结果:390,000
是否有中文文档:否

详细功能:

  1. 链式请求/响应方法
  2. URL / JSON / plist参数编码
  3. 上传文件/数据/流/多表单数据
  4. 使用请求或者断点下载来下载文件
  5. 使用URL凭据进行身份认证
  6. HTTP响应验证
  7. 包含进度的上传和下载闭包
  8. cURL命令的输出
  9. 动态适配和重试请求
  10. TLS证书和Public Key Pinning
  11. 网络可达性
  12. 全面的单元和集成测试覆盖率

使用体验:导入框架后尝试 get 和 post 请求,成功。操作简单,和 AFNetworing 使用体验相似,值得一提的是,服务器返回数据不用再次转换,可直接根据服务器数据设置响应 handler。其他没有深入测试。数据缓存方面,Alamofire 是通过 NSURLCache 这个类来实现的。

4.Moya(基于 Alamofire)

Star 数:9,179
最近一次更新时间:3 天以前
谷歌搜索词条结果:869,000
百度搜索词条结果:92,900
是否有中文文档:是

详细功能:

  1. 基于 Alamofire 的 Networking library,并且添加了对于 ReactiveCocoa 和 RxSwift 的接口支持,简化了开发过程
  2. 编译的时候会检查 API endpoint
  3. 可以用枚举值清楚地定义很多 endpoint
  4. 增加了 stubResponse 类型,大大方便了

使用体验:导入框架后尝试 get 和 post 请求,成功。比起 Alamofire 的优点是,我们实际使用 Alamofire 时,会根据我们的需求对 Alamofire 进行再次封装一个类以便区分和直接操作命令请求或者数据请求。Moya 相当于替我们完成了这一步,允许我们高度自定义他,根据具体的需求进行接口的设置。其他没有深入测试。使用有一定门槛。

5.结论:推荐主要使用 AFNetworking,猿题库的网络请求框架固然好用,但最近更新是一年前。因为作者相同,以及是对相同作者的库进行封装的两个库,对 Swift 的这两个框架可以保持关注。

三、iOS 数据库框架调研

1.fmdb

Star 数:12,587
最近一次更新时间:17 天以前
谷歌搜索词条结果:358,000
百度搜索词条结果:1,230,000
是否也支持 Swift:是
是否有中文文档:否

使用 Objective-C 封装的 SQLite API 的数据库框架,SQLite是一个开源的轻型数据库,本身API是C语言实现的,在IOS上使用不便,FMDB对其进行封装,使得方便使用之外也增加了线程安全的处理。
特点:
1、学习成本一般
2、完全开源
3、需要使用sql语句
4、扩展性好
5、多线程处理得很好

2.realm-cocoa (同时有OC、Swift 库以及 Java 库)

Star 数:12,360
最近一次更新时间:17 天以前
谷歌搜索词条结果:16,100,000
百度搜索词条结果:269,000
是否有中文文档:否

由YCombinator孵化的创业团队打造,是第一个专门针对移动平台设计的数据库,Realm并不是基于Core Data,也不是基于 SQLite 所构建 ORM 的,它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。核心引擎不开源(但其承诺以后会开源)。
特点:
1、学习成本非常低
2、不需要使用sql语句
3、扩展性一般
4、还不够完全成熟(还在发展中)

3.MagicalRecord

Star 数:10,716
最近一次更新时间:17 天以前
谷歌搜索词条结果:254,000
百度搜索词条结果:403,000
是否也支持 Swift:是
是否有中文文档:否

Magical Record是用来操作Core Data的一个第三方工具,而Core Data则是iOS的内置框架,一个模型层的技术. Core Data 本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案。可以理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取. Core Data不是一个 O/RM, 也不像 FMDB 是一个 SQL wrapper。
特点:
1、学习成本非常高(即使Magical Record做了简化)
2、可视化和Xcode结合程度高
3、可以不使用sql语句
4、扩展性好
5、多线程处理不好(大部分操作需要主线程完成,会导致UI卡顿)

经过 单条多次插入数据性能对比、批量插入数据性能对比、数据查询性能对比、数据更新性能对比

  1. MagicalRecord数据库主要在主线完成,无论是插入、查询还是更新都有卡顿现象,暂时未找到多线程操作的方案,即使使用多线程也非常容。
  2. 跟两个表的操作性能对比来说,节省字段来提升性能并没有显的作用。
  3. 从插入数据的性能来说MagicalRecord最好,但CPU占用高,Realm表现最差接近是FMDB的三倍。而数据查询的话,还是Realm 有明显的优势是速度是其他2者的6、7倍,FMDB也和MagicalRecord相当。数据更新则是Realm表现最好,MagicalRecord略差。总体而言,FMDB的各方面表现比较均衡,Realm强在于查询性能好,但插入数据有明显性能问题。MagicalRecord总体来说数据插入性能最好的,coredata是做了内存缓存的优化,带来的问题就是在插入的数据在其他线程查询不到,面表现一般。
  4. MagicalRecord学习曲线陡峭,不适合使用多线程,容易出错,出错后不好排查。FMDB需要写sql语句,实现的代码量较大,优势在于各方面性能均衡。Realm简单易学,代码简洁,主要的缺点还是数据插入的性能不好。

4.结论:推荐使用 FMDB,对 Realm 保持关注。

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/034.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%