我希望使用FMDB在我的应用中创建3个或更多不同的单例以处理不同的商店场景,单例的例子如下:
·H
@interface MyManager : NSObject
+ (id)sharedManager;
- (BOOL)isChecked:(int)id_product;
@end
的.m
@implementation MyManager
@synthesize someProperty;
#pragma mark Singleton Methods
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:databasePath]; //or FMDatabase
}
return self;
}
- (BOOL)isChecked:(int)id_product
{
BOOL isChecked = NO;
[self.databaseQueue inDatabase:^(FMDatabase *db) {
FMResultSet *product_query = [db executeQuery:@"SELECT isChecked FROM products WHERE id = ?",[NSNumber numberWithInt:id_product]];
while ([product_query next]) {
if ([product_query boolForColumn:@"isChecked"] == 1) {
isChecked = YES;
} else {
isChecked = NO;
}
}
}];
return isChecked;
}
@end
所以我的问题是,我可以创建3个或更多这样的单例,使用FMDatabaseQueue
或FMDatabase
定义为类的类属性,并且最好使用FMDatabaseQueue
还是FMDatabase
?
答案 0 :(得分:1)
一些想法:
理论上,您可以拥有三个不同类别的单例对象,每个对象都有自己的FMDatabase
/ FMDatabaseQueue
实例。
你是否应该这样做是一个完全不同的问题。有三个,没有一些非常有说服力的论据,表明一些严重的代码味道。
确保这三个实例中没有一个尝试访问同一个数据库文件,否则您将失去FMDatabaseQueue
的全部目的。如果您处理三个不同的数据库文件(即便如此,它看起来像一个奇怪的设计),这三个实例模型只是合理的。
你说"我认为我只能使用一个单例,使用不同单例的想法只是为了使代码更具可读性,并将操作划分为类型。"
这绝对不是三个单身人士类的论据。你应该只有一个。
就FMDatabase
与FMDatabaseQueue
而言,后者可让您享受多线程访问,因此我会倾向于此。使用FMDatabase
没有明显优势,但不必要地引入了限制。
FMDatabaseQueue
的全部目的是在多个线程访问同一个数据库时管理数据库争用。因此,如果您绝对确定地知道您永远不会从不同的线程访问FMDatabase
对象,那么您可以使用FMDatabase
。
但为什么要把自己画成这样的角落?只需使用FMDatabaseQueue
,然后您就不必担心它。如果你从多个线程中使用它(例如你使用GCD块中的实例,异步方法的完成处理程序等等),它可以在单个线程中使用并且可以避免许多令人头痛的问题。