iOS FMDB多线程之FMDatabaseQueue使用

iOS FMDB之FMDatabaseQueue(事物与非事物)https://www.jianshu.com/p/67afbcf32808

 

简述:

FMDB是iOS广泛使用的数据库第三方框架。FMDB git地址,其基本使用方法在官方文档上有详细说明,文档描述也非常清楚明了,本文旨在说明FMDB在多线程环境下FMDatabaseQueue的使用注意事项。本文所述的FMDB是基于FMDB V2.6.2 版本。

FMDatabaseQueue源代码简析:

     1:FMDatabaseQueue初始化

由此可知, dispatch_queue_create第二个参数 指定 DISPATCH_QUEUE_SERIAL 或者是NULL的时候,创建的队列是串行队列.所以,FMDatabaseQueue是一个串行队列。然后使用dispatch_queue_set_specific向_queue中设置一个kDispatchQueueSpecificKey标识;

  2:FMdatabaseQueue 打开和关闭数据库

  在初始化时候FMdatabaseQueue已经将打开和关闭数据库封装好了。所以在操作数据库时候不需要单独调用FMDatabase的open与close方法

3:FMDatabaseQueue操作数据库

通过dispatch_get_specific(kDispatchQueueSpecificKey)获取初始化的_queue。在执行时候,由dispatch_sync(_queue, ^() {

}可知。FMDatabaseQueue是同步执行。所以_queue是 同步串行队列

 

FMDatabaseQueue 封装:

基于FMDatabaseQueue为同步串行队列来保证数据库访问的安全性。所以在封装FMDatabaseQueue时候应该把该Queue封装为单例对象。

FMDatabaseQueue数据库访问

这里需要注意一点。- (void)inDatabase:(void (^)(FMDatabase *db))block不可以嵌套使用。原理很简单。基于_queue为同步串行队列,如果嵌套使用则会引起死锁。

一种常见的多线程访问封装如下

 

需要注意点在于 结果返回的时候,是在[_dataBaseQueue inDatabase:^(FMDatabase *db){

}]; block外部。这样,在结果回调以后,可以继续执行下一个自己封装的数据库访问方法。


作者:冰封烈焰
链接:https://www.jianshu.com/p/d57c2b095cca
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值