0

我有一些使用 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 之后记录?这样执行线程会被阻塞,直到提供给队列的块实际执行?

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

[db open]另外,使用时需要打电话FMDatabaseQueue吗?

4

1 回答 1

1

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

这是因为在内部FMDatabaseQueue -inDatabase:使用调用来执行数据库操作(如您在源代码dispatch_sync中所见)。

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

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

于 2013-08-18T23:20:59.497 回答