gpt4 book ai didi

ios - 在单例中使用 FMDB,更好的是 FMDatabase 或 FMDatabaseQueue

转载 作者:行者123 更新时间:2023-11-29 12:31:07 27 4
gpt4 key购买 nike

我想使用 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 个或更多这样的单例,使用 FMDatabaseQueueFMDatabase 定义为类的类属性,并且更好使用 FMDatabaseQueueFMDatabase

最佳答案

一些想法:

  1. 理论上,您可以拥有三个不同类的单例对象,每个对象都有自己的 FMDatabase/FMDatabaseQueue 实例。

    你是否应该这样做是一个完全不同的问题。有三个,没有一些非常有说服力的论据,表明有一些严重的代码味道。

  2. 确保这三个实例中没有一个正在尝试访问同一个数据库文件,否则您将破坏 FMDatabaseQueue 的全部目的。只有当您处理三个不同的数据库文件时,这种三实例模型才是合理的(即便如此,这似乎是一个奇怪的设计)。

    你说“我认为我只能使用一个单例,使用不同单例的想法只是为了使代码更具可读性,并根据类型划分操作。”

    也就是说,绝对不是三个单例类的论据。你应该只有一个。

  3. FMDatabaseFMDatabaseQueue 方面,后者使您能够享受多线程访问,所以我倾向于后者。使用 FMDatabase 没有显着优势,但引入了不必要的限制。

    FMDatabaseQueue 的全部目的是在多个线程访问同一个数据库时管理数据库争用。因此,如果您非常肯定地知道您永远不会从不同的线程访问 FMDatabase 对象,那么您可以使用 FMDatabase

    但为什么要把自己画成那样的角落呢?只需使用 FMDatabaseQueue,然后您就不必担心了。如果从单线程使用,它工作正常,如果您碰巧从多线程使用它,则可以让您免于许多麻烦(例如,您使用来自 GCD block 的实例,异步方法的内部完成处理程序等)。

    <

关于ios - 在单例中使用 FMDB,更好的是 FMDatabase 或 FMDatabaseQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com