iOS FMDB多线程之FMDatabaseQueue使用

简述:

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外部。这样,在结果回调以后,可以继续执行下一个自己封装的数据库访问方法。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容