我有一些使用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

最佳答案

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

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

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

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

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

10-09 15:35