初学ios的时候,只用了几天原生的sqlite API,就换了FMDatabase。那会对ios的线程不熟悉,对FMDatabase也不熟悉,只是觉得需要频繁open & close Database太麻烦,就直接照搬别的语言的经验,封装了一个FMDatabase的单例
@implementation YLSDatabaseHelper
{
FMDatabase* db;
}
-(id) init
{
self = [super init];
if(self){
NSString *dbFilePath = [YLSGlobalUtils getDatabaseFilePath];
db = [[FMDatabase alloc] initWithPath:dbFilePath];
}
return self;
}
+(YLSDatabaseHelper*) sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
+(void) refreshDatabaseFile
{
YLSDatabaseHelper *instance = [self sharedInstance];
[instance doRefresh];
}
-(void) doRefresh
{
NSString *dbFilePath = [YLSGlobalUtils getDatabaseFilePath];
db = [[FMDatabase alloc] initWithPath:dbFilePath];
}
-(void) doOperation:(void(^)(FMDatabase*))block
{
[db open];
block(db);
[db close];
}
@end
原本觉得单例用起来很方便,也不需要经常open close了。直到最近收到几次Crashlytics的crash report,再上FMDatabase的网站看了下,才知道这种封装方式在多线程环境下是很有问题的:
Using a single instance of FMDatabase from multiple threads at once is a bad idea. It has always been OK to make a FMDatabase objectper thread. Just don't share a single instance across threads, and definitely not across multiple threads
at the same time. Bad things will eventually happen and you'll eventually get something to crash, or maybe get an exception, or maybe meteorites will fall out of the sky and hit your Mac Pro.This would suck.
So don't instantiate a single FMDatabase object and use it across multiple threads.
在多线程情况下,共享同一个FMDatabase实例就是一个最差实践,我原本这种封装的方式完全就是错误的。正确的做法是每个线程创建一个新的FMDatabase的实例,或者使用FMDatabaseQueue类
分享到:
相关推荐
常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库...
跳线封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装规格逻辑封装...
PcbLib文件类型、直插元器件、贴片、Altium Designer封装库 变压器封装PCB文件3D封装Altium Designer库的型号类型如下,总有你需要的一款: DA10XC、DA10XMC、EE42-15V 8+8、EE-35-V、EE-40、EE-42、EE-42V、EE-42X2...
参照MJExtionsion,用runtime实现遍历模型属性,数据存储读取直接面向对象,递归实现存储读取模型嵌套模型,不需要再写sql语句。。。框架还在慢慢完善中,已经在项目中运用......大家有啥想法都可以给我说说, git@...
PcbLib文件类型、贴片库、Altium Designer封装库 DFN封装库PCB文件3D封装Altium Designer库的型号类型如下,总有你需要的一款: DFN-10_L3.0-W3.0-P0.50、PG-TDSON-8_5x6MM、TDFN-6_L2.0-W2.0-P0.65、TDFN-6_L2.0-W...
XH2.54封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
VBA代码封装助手VBA代码封装助手
排针-排母封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
KF接线端子封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
M3铜柱封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
电容封装,钽电容封装,0603封装,1206封装,3126封装,3528封装,6032封装,0805封装。。。。。电容封装,钽电容封装,0603封装,1206封装,3126封装,3528封装,6032封装,0805封装
XT电源接口封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
ESOP封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
QFN贴片芯片封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
封装库.rar 封装库.ra封装库.rar r封装库.rar
XH2.54封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~
系统封装 111 额 系统封装 系统封装 系统封装 系统封装 系统封装
3d封装库\3D-DIP插件.PcbLib 3d封装库\3D-SMD系列.PcbLib 3d封装库\3D-super3DLIB.PcbLib 3d封装库\3D-图标.PCBLIB 3d封装库\3D-封装库.PcbLib 3d封装库\3D-库.PcbLib 3d封装库\3D-接头jietou .PcbLib 3d封装库\3D-...
PHD2.0封装(三维PCB封装库)AD用PCB封装库,作者主页下有全套的三维PCB封装库,欢迎大家下载使用。文件为作者千辛万苦整理的,请大家自用,不要随意传播,谢谢!~