/ / Como impedir que um seletor seja acessado várias vezes ao mesmo tempo? - ios, objetivo-c, sqlite, nsoperation, fmdb

Como bloquear um seletor seja acessado várias vezes ao mesmo tempo? - ios, objetivo-c, sqlite, nsoperation, fmdb

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 № 1

Se 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.