簡述:
FMDB是iOS廣泛使用的數(shù)據(jù)庫第三方框架。FMDB git地址 ,其基本使用方法在官方文檔上有詳細(xì)說明,文檔描述也非常清楚明了,本文旨在說明FMDB在多線程環(huán)境下FMDatabaseQueue的使用注意事項(xiàng)。本文所述的FMDB是基于FMDB V2.6.2 版本。
FMDatabaseQueue源代碼簡析:
? ? ?1:FMDatabaseQueue初始化

由此可知, dispatch_queue_create第二個參數(shù) 指定 DISPATCH_QUEUE_SERIAL 或者是NULL的時候,創(chuàng)建的隊(duì)列是串行隊(duì)列.所以,F(xiàn)MDatabaseQueue是一個串行隊(duì)列。然后使用dispatch_queue_set_specific向_queue中設(shè)置一個kDispatchQueueSpecificKey標(biāo)識;
? 2:FMdatabaseQueue 打開和關(guān)閉數(shù)據(jù)庫
? 在初始化時候FMdatabaseQueue已經(jīng)將打開和關(guān)閉數(shù)據(jù)庫封裝好了。所以在操作數(shù)據(jù)庫時候不需要單獨(dú)調(diào)用FMDatabase的open與close方法
3:FMDatabaseQueue操作數(shù)據(jù)庫

通過dispatch_get_specific(kDispatchQueueSpecificKey)獲取初始化的_queue。在執(zhí)行時候,由dispatch_sync(_queue, ^() {
}可知。FMDatabaseQueue是同步執(zhí)行。所以_queue是 同步串行隊(duì)列。
FMDatabaseQueue 封裝:
基于FMDatabaseQueue為同步串行隊(duì)列來保證數(shù)據(jù)庫訪問的安全性。所以在封裝FMDatabaseQueue時候應(yīng)該把該Queue封裝為單例對象。
FMDatabaseQueue數(shù)據(jù)庫訪問

這里需要注意一點(diǎn)。- (void)inDatabase:(void (^)(FMDatabase *db))block不可以嵌套使用。原理很簡單?;赺queue為同步串行隊(duì)列,如果嵌套使用則會引起死鎖。
一種常見的多線程訪問封裝如下

需要注意點(diǎn)在于 結(jié)果返回的時候,是在[_dataBaseQueue inDatabase:^(FMDatabase *db){
}]; block外部。這樣,在結(jié)果回調(diào)以后,可以繼續(xù)執(zhí)行下一個自己封裝的數(shù)據(jù)庫訪問方法。