Eu tenho um seletor que atualiza meu banco de dados sqlite (FMDB framework) fillTopXTraps
. Quando ligo para o seletor, atualizamos 2 bancos de dados separados, ele falha na classe "DataBase" (em breve -> "db"). E eu tenho esse erro:
O FMDatabase está atualmente em uso.
várias vezes.
eu tentei ligar fillTopXTraps
usando:
[databaseQueue addOperation:invokeOperation];
[databaseQueue waitUntilAllOperationsAreFinished];
E eu tenho um erro "banco de dados está bloqueado" e:
[NSOperationQueue addOperations: waitUntilFinished:]: 1 (de 1) A operação está concluída, em execução ou já está em uma fila e não pode ser enfileirado
Tentei usar o FMDatabaseQueue e ainda tenho o erro "o banco de dados está bloqueado" e "... atualmente em uso".
Como posso ter certeza fillTopXTraps
não continuará se já estiver sendo processadoe saberá esperar até terminar e continuar. Ou talvez o problema seja o banco de dados chamado de vários threads, aparentemente, como posso corrigi-lo?
Respostas:
0 para resposta № 1Se você enviar suas atualizações por uma fila serial, elas serão executadas na ordem 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
}];
Observe que a tarefa é executada de forma assíncrona, mas depois de executada, ela é sincronizada com a fila principal. Espero que seja isso que você está procurando.