gpt4 book ai didi

ios - FMDB 排队 - 如何正确实现此模式?

转载 作者:行者123 更新时间:2023-11-29 03:41:55 27 4
gpt4 key购买 nike

我有一些使用 FMDB sqllite 包装器 ( https://github.com/ccgus/fmdb ) 的代码,并且我希望从多个线程执行此代码。因此,我使用 FMDatabaseQueue 类来执行所有数据库工作。

我对这种模式有点困惑,例如

FMDatabaseQueue *q = [FMDatabaseQueue databaseQueueWithPath:@""];
[q inDatabase:^(FMDatabase *db) {
NSLog(@"1");
BOOL yn = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS Foo (Bar TEXT)"];
NSLog(@"2%@", yn ? @"YES" : @"NO");
}];
NSLog(@"3");

如果你看看上面的代码..是否保证 3 总是在 2 和 1 之后被记录?这样执行线程就会被阻塞,直到提供给队列的 block 真正开始执行为止?

如果是这样,我是否应该删除该 block 之外和之后的所有非数据库工作,以便使用该队列的任何其他线程不会被不需要跨线程同步的工作阻塞?

另外,使用FMDatabaseQueue时是否需要调用[db open]

最佳答案

是的,保证在 1 和 2 之后记录 3。

这是因为 FMDatabaseQueue -inDatabase: 在内部使用 dispatch_sync 调用来执行数据库操作(如 source code 中所示)。

因此,建议在 block 内尽可能少地完成工作,并在您自己的队列上完成所有其他工作。

此外,不需要[db open],因为FMDatabaseQueue -initWithPath:(由FMDatabaseQueue +databaseQueueWithPath:调用)已经做到了这一点(同样,您可以在 source code 中看到)。

关于ios - FMDB 排队 - 如何正确实现此模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304079/

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