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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。