iOS FMDB多線程之FMDatabaseQueue使用

簡述:

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ù)庫訪問方法。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容