Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios FMDB排队-如何正确实现此模式?_Ios_Objective C_Sqlite_Fmdb - Fatal编程技术网

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

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

我有一些使用FMDB sqllite包装器()的代码,我希望这些代码可以从多个线程执行。因此,我使用
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:。