【问题标题】:FMDB queueing - how does is this pattern correctly implemented?FMDB 排队 - 这个模式是如何正确实现的?
【发布时间】:2013-08-19 07:21:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios objective-c sqlite fmdb


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我猜一个人永远也不应该从 FMDatabase 队列中排队另一个块呢? +感谢指向代码的指针!
    • 还有一个问题 - 我应该循环块内的 FMResultSet 还是可以将其传递出块(不确定是否有隐藏的智能来清理块末尾的任何内容)
    • 您需要在块内进行循环。
    • 是的,永远不要尝试使用 inDatabase: 递归。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2017-03-15
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多