如何阻止选择器一次被多次访问?

时间:2014-02-05 08:04:58

标签: ios objective-c sqlite nsoperation fmdb

我有一个更新我的sqlite(FMDB框架)数据库fillTopXTraps的选择器。 当我调用选择器更新2个单独的数据库时,它在'DataBase'类中失败(很快 - >'db')。 我有这个错误:

  

FMDatabase目前正在使用中。

多次。

我尝试使用以下方式致电fillTopXTraps

[databaseQueue addOperation:invokeOperation];
[databaseQueue waitUntilAllOperationsAreFinished];

我发现错误'数据库被锁定'并且:

  

[NSOperationQueue addOperations:waitUntilFinished:]:1(of 1)   操作已完成,正在执行或已在队列中,并且不能   排队的

我尝试使用FMDatabaseQueue但仍然有错误'数据库被锁定'和'...当前正在使用。'。

如果fillTopXTraps已经被处理,我将如何确保{{1}}不会继续,并且知道等到完成然后继续。 或许问题是显然是从多个线程调用的数据库,我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果您通过串行队列分派更新,它们将按FIFO顺序运行:

-(void)serialize:(void (^)(void))task
{
    static dispatch_queue_t serialQueue = NULL;
    if (!serialQueue) { 
        serialQueue = dispatch_queue_create("com.your.serial.queue", DISPATCH_QUEUE_SERIAL);
    }
    dispatch_async(serialQueue, ^{
        dispatch_sync(dispatch_get_main_queue(), task);
    });
}

[self serialize:^{
    // database update
}];

请注意,该任务是异步运行的,但一旦执行,它就会同步到主队列。我希望这就是你要找的东西。