我有一个更新我的sqlite(FMDB框架)数据库fillTopXTraps
的选择器。
当我调用选择器更新2个单独的数据库时,它在'DataBase'类中失败(很快 - >'db')。
我有这个错误:
FMDatabase目前正在使用中。
多次。
我尝试使用以下方式致电fillTopXTraps
[databaseQueue addOperation:invokeOperation];
[databaseQueue waitUntilAllOperationsAreFinished];
我发现错误'数据库被锁定'并且:
[NSOperationQueue addOperations:waitUntilFinished:]:1(of 1) 操作已完成,正在执行或已在队列中,并且不能 排队的
我尝试使用FMDatabaseQueue但仍然有错误'数据库被锁定'和'...当前正在使用。'。
如果fillTopXTraps
已经被处理,我将如何确保{{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
}];
请注意,该任务是异步运行的,但一旦执行,它就会同步到主队列。我希望这就是你要找的东西。