簡述:
FMDB是iOS廣泛使用的數(shù)據(jù)庫第三方框架修档。FMDB git地址 ,其基本使用方法在官方文檔上有詳細說明府框,文檔描述也非常清楚明了吱窝,本文旨在說明FMDB在多線程環(huán)境下FMDatabaseQueue的使用注意事項。本文所述的FMDB是基于FMDB V2.6.2 版本迫靖。
FMDatabaseQueue源代碼簡析:
? ? ?1:FMDatabaseQueue初始化
由此可知院峡, dispatch_queue_create第二個參數(shù) 指定 DISPATCH_QUEUE_SERIAL 或者是NULL的時候,創(chuàng)建的隊列是串行隊列.所以,F(xiàn)MDatabaseQueue是一個串行隊列系宜。然后使用dispatch_queue_set_specific向_queue中設(shè)置一個kDispatchQueueSpecificKey標識照激;
? 2:FMdatabaseQueue 打開和關(guān)閉數(shù)據(jù)庫
? 在初始化時候FMdatabaseQueue已經(jīng)將打開和關(guān)閉數(shù)據(jù)庫封裝好了。所以在操作數(shù)據(jù)庫時候不需要單獨調(diào)用FMDatabase的open與close方法
3:FMDatabaseQueue操作數(shù)據(jù)庫
通過dispatch_get_specific(kDispatchQueueSpecificKey)獲取初始化的_queue盹牧。在執(zhí)行時候俩垃,由dispatch_sync(_queue, ^() {
}可知。FMDatabaseQueue是同步執(zhí)行汰寓。所以_queue是 同步串行隊列口柳。
FMDatabaseQueue 封裝:
基于FMDatabaseQueue為同步串行隊列來保證數(shù)據(jù)庫訪問的安全性。所以在封裝FMDatabaseQueue時候應(yīng)該把該Queue封裝為單例對象有滑。
FMDatabaseQueue數(shù)據(jù)庫訪問
這里需要注意一點跃闹。- (void)inDatabase:(void (^)(FMDatabase *db))block不可以嵌套使用。原理很簡單毛好⊥眨基于_queue為同步串行隊列,如果嵌套使用則會引起死鎖睛榄。
一種常見的多線程訪問封裝如下
需要注意點在于 結(jié)果返回的時候荣茫,是在[_dataBaseQueue inDatabase:^(FMDatabase *db){
}]; block外部想帅。這樣场靴,在結(jié)果回調(diào)以后,可以繼續(xù)執(zhí)行下一個自己封裝的數(shù)據(jù)庫訪問方法港准。