Ios FMDB排队-如何正确实现此模式?
我有一些使用FMDB sqllite包装器()的代码,我希望这些代码可以从多个线程执行。因此,我使用Ios FMDB排队-如何正确实现此模式?,ios,objective-c,sqlite,fmdb,Ios,Objective C,Sqlite,Fmdb,我有一些使用FMDB sqllite包装器()的代码,我希望这些代码可以从多个线程执行。因此,我使用FMDatabaseQueue类来执行所有数据库工作 我对这种模式有点困惑 FMDatabaseQueue *q = [FMDatabaseQueue databaseQueueWithPath:@""]; [q inDatabase:^(FMDatabase *db) { NSLog(@"1"); BOOL yn = [db executeUpdate:@"CREATE TABL
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?这样执行线程就会被阻塞,直到提供给队列的块实际执行为止
如果是这样,我是否应该删除块外部和之后的任何非数据库工作,以便使用队列的任何其他线程不会被不需要跨线程同步的工作阻塞
另外,使用
FMDatabaseQueue
时是否需要调用[db open]
?是的,保证在1和2之后记录3
这是因为FMDatabaseQueue-inDatabase:
在内部使用dispatch\u sync
调用来执行数据库操作(如中所示)
因此,建议您在块内尽可能少地完成工作,并在您自己的队列上完成所有其他工作
另外,不需要使用
[db open]
,因为FMDatabaseQueue-initWithPath:
(由FMDatabaseQueue+databaseQueueWithPath:
调用)已经做到了这一点(同样,您可以在中看到)。谢谢。我猜一个人也不应该在FMDatabase队列中加入另一个块+谢谢你的代码指针!还有一个问题-我应该在块内循环FMResultSet还是可以将其从块外传递出去(不确定是否有隐藏的智能来清理块末尾的任何内容),您需要在块内循环。是的,永远不要尝试递归地使用inDatabase:。