iOS FMDB多线程之FMDatabaseQueue使用

简述:

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

FMDatabaseQueue源代码简析:

     1:FMDatabaseQueue初始化


iOS FMDB多线程之FMDatabaseQueue使用_第1张图片

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

  2:FMdatabaseQueue 打开和关闭数据库

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

3:FMDatabaseQueue操作数据库


iOS FMDB多线程之FMDatabaseQueue使用_第2张图片

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

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


FMDatabaseQueue 封装:

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

FMDatabaseQueue数据库访问


iOS FMDB多线程之FMDatabaseQueue使用_第3张图片

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

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


iOS FMDB多线程之FMDatabaseQueue使用_第4张图片


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

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


你可能感兴趣的:(iOS FMDB多线程之FMDatabaseQueue使用)