新年新语言,WCDB Swift

WCDB ObjC 版本的实现中,由于引入了 C++ 代码,并不能直接 bridge 到 Swift。因此,我们从 9 月份开始就着手使用原生的 Swift,重写 WCDB。并于 10.10 和 11.8 分别在开发者群内发布了 alpha 和 beta 版进行测试。

今天,终于可以正式发布 WCDB Swift 的第一个正式版本了。

WCDB Swift 约有 1.5w 行代码,使用 Pure Swift 编写,几乎不包含 Cocoa 的代码。且与 ObjC 版保持完全一致的功能。

模型绑定

WCDB Swift 的模型绑定,基于 Swift 4.0 的协议实现。通过建立 Swift 类型与数据库表之间的映射关系,使得开发者可以通过类对象直接操作数据库。

语言集成查询

语言集成查询深度结合了 Swift 和 SQL 的语法,使得纯字符串的 SQL 可以以代码的形式表达出来。结合代码提示及纠错,极大地提高开发效率。

同时,由于 Swift 的语法 比 Objective-C 更加简洁,并有更强大的范型和类型推导,使得 WCDB 接口不仅更易编写,而且更易读易维护。

类似的语法,其返回值并不为,而是语言集成查询的对象,WCDB 会根据这个语句,去进行 SQL 的查询。同时,通过类型的定义,Swift 即可推导出 WCDB 查询的结果为类。

语言集成查询同时内建了反注入机制,可以避免第三方从输入框注入 SQL,进行预期之外的恶意操作。

深入 SQLite 源码的性能优化

WCDB 基于 SQLite 开发,我们在之前的文章介绍过其对 SQLite 源码进行的性能优化,以适配移动终端的场景。同样地,这部分优化 Swift 版本也能享受到。

线程安全且并发

WCDB Swift 不仅可以安全地在任意线程进行数据库操作,且其内部会智能地根据操作类型调配资源,使其能够并发执行,进一步提升效率。

加密

基于 SQLCipher 的加密机制,可以为客户端数据安全提供一定程度的保障。

字段升级

数据库模型与类定义绑定,使得字段的增加、删除、修改都与类变量的定义保持一致,不需要开发者额外地管理字段的版本。

模型绑定中新增了字段,该字段也会被自动创建到数据库表中,开发者不需要手动管理。

全文搜索

WCDB Swift 提供简单易用的全文搜索接口,并包含适配多种语言的分词器,使得数据搜索更精准。

损坏修复

内建的修复工具可以在系统错误、磁盘故障等情况下,尽最大限度地将损坏的数据找回并导出。

Pure Swift

模型绑定对语言的依赖性很大。由于 ObjC 其强大的消息转发机制,使得 WCDB 实现起来并没有太大的问题。然而,动态性却恰恰是 Swift 一直为人诟病的地方。

最省事的解决方案就是,直接引入 Cocoa,所有的问题都将不再是问题。然而,这并不是我们所期望的。

理性分析可以得出,一方面,全面的动态化会拖累 Swift 的性能,另一方面,这也会使得 Swift 的原生类型难以享受到模型绑定。

但我们的理由可能更感性一些 --- 情怀。称之为强迫症也好,代码洁癖也罢,Swift with Cocoa 总让人心里有那么一丝别扭。因此,我们决定寻找 Swift 原生的解决方案。

WCDB 的模型绑定对语言有两点依赖:

1. Accessor。ObjC 版本使用的指针,使得 WCDB 可以获取变量的值,并插入到数据库中,或从数据库中获取数据写入到变量。

2. 数据库字段的映射。ObjC 版本使用宏定义,使得 WCDB 可以通过的方式进行语言集成查询的操作。

KeyPath

我们最初盯上的是 Swift 的的机制,它通过的语法,可以直接对变量进行读写操作,且语法上也与类似。

一个难题是,在不引入 Cocoa 的情况下,是并不提供 property 的名称,这就无法通过直接映射数据库的字段。

Swift 也有一个相关的 SR 在讨论这个问题。

显然,我们不可能等待这个特性实现了再去做 WCDB Swift。因此我们尝试使用“不常规”的方法,获取到对应的 property 名称。

是 Swift 里的反射类型,它可以遍历每个变量,获取其名称和值,但不能对变量写入数据。因此我们可以通过对变量设一个独一无二的特征值,然后再通过遍历变量,导出与特征值相同的 property 名称。

这个“不常规”的用法在大部分情况下能够生效,但对于和相互嵌套的变量,容易因为内存混乱导致 crash。

Codable

在的方案不够完善的情况下,我们转投了协议。它是 Swift 4.0 新增的特性,本质是编译前根据定义生成代码,以完成序列化和反序列化的任务。

对应到 WCDB,将数据库的字段读写到变量中,其本质就是一个序列化和反序列化的过程,而也可能可以用于语言集成查询中的字段映射。

然而,由于这个特性还很新,还没有太多文档对其进行深入介绍,尤其是自定义和这部分。

所幸的是,Swift 本身就是开源的。因此,我们参考 swift-corelibs-foundation 中的和,实现了和,并通过的定义,映射数据库中的字段。

最终维护了我们对 Pure Swift 的坚持。

相信这会是大家非常关心的问题。然而,很遗憾,目前还没有。不仅微信,国内外大部分 app 都还没有完全转向Swift,但显然这是个趋势。

Google 在 11 月 fork 了 Swift。

大家犹豫不定的原因都大同小异:ABI不稳定,需要将二进制打包进去,增大app体积;某些方面性能还不够好,而且现在多数是与 ObjC 混编,将进一步拉低性能 等等。

而这其中一个很重要的原因就是,Swift 的基础设施还不完善,还难以支撑其大型 app 的开发。而 WCDB Swift 就是这类基础设施之一。

本文来自企鹅号 - WeMobileDev媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信终端开发团队的专栏

新年新语言,WCDB Swift

WCDB 作为微信的开发者们的需求,并不断优化性能。而这其中,呼声最高的莫过于对 Swift 的支持。

79180
来自专栏walterlv - 吕毅的博客

每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译

发布于 2018-05-14 07:46 更新于 2018-07...

7110
来自专栏章鱼的慢慢技术路

浅谈单片机中C语言与汇编语言的转换

45930
来自专栏风口上的猪的文章

.NET面试题系列[1] - .NET框架基础知识(1)

面试出现频率:从来没人问过。事实上我都不知道怎么问,考背书吗?倒是可以问问知不知道现在.NET最新版本是什么,考察面试者是否对新技术足够敏感。

30310
来自专栏美团技术团队

Android热更新方案Robust

美团•大众点评是中国最大的O2O交易平台,目前已拥有近6亿用户,合作各类商户达432万,订单峰值突破1150万单。美团App是平台主要的入口之一,O2O交易场景...

43290
来自专栏王清培的专栏

.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET R...

25190
来自专栏跟着阿笨一起玩NET

ReSharper 配置及用法

1:安装后,Resharper会用他自己的英文智能提示,替换掉 vs2010的智能提示,所以我们要换回到vs2010的智能提示

16510
来自专栏小狼的世界

Go学习入门

Go语言的历史要从贝尔实验室开始说起,我们知道贝尔实验室计算科学研究中心的肯•汤普逊 Ken Thompson 和丹尼斯 • 里奇 Dennis Ritchie...

38120
来自专栏极客慕白的成长之路

信息安全实验室招新试题和完全解析

写个网页应该是很简单的,不管是静态网页还是带特效的网页。但是有几个问题,需要说明一下。

12830
来自专栏人人都是极客

Linux内核内存管理算法Buddy和Slab

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page...

59660

扫码关注云+社区

领取腾讯云代金券