我有一些使用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");
如果你看一下上面的代码..是否保证在2和1之后总会记录3?这样,执行线程被阻塞,直到提供给队列的块实际执行?
如果是这样,我是否应该删除块外部和之后的任何非数据库工作,以便使用该队列的任何其他线程不会被不需要跨线程同步的工作阻止?
此外,使用[db open]
时,是否需要致电FMDatabaseQueue
答案 0 :(得分:1)
是的,它保证在1和2之后记录3。
这是因为FMDatabaseQueue -inDatabase:
在内部使用dispatch_sync
调用来执行数据库操作(正如您在source code中看到的那样)。
因此,建议将在块内做更少的工作,并在您自己的队列中完成所有其他工作。
此外,不需要[db open]
,因为FMDatabaseQueue -initWithPath:
(由FMDatabaseQueue +databaseQueueWithPath:
调用)已经这样做了(再次,您可以在source code中看到)。