Usare FMDB in “Thread-Safe”

Creato il 07 agosto 2010 da Malcommac

Usare SQLite su iPhone SDK significa divertirsi con il C. Se non si ha pero’ bisogno guardare alle performance come un fattore critico (e quindi nel 90% dei casi) è possibile ricorrere ad uno dei diversi wrapper objective-c che si trovano in rete. FMDB è uno di questi e si caratterizza per l’estrema semplicità e velocità nell’uso.

Utilizzando FMDB mi è capitato di dover agire su uno stesso DB da più thread differenti. Se si ha una sola istanza aperta del db (la normalità) è possibile eseguire un solo statement alla volta: l’autore del progetto si è infatti preoccupato di munire le funzioni degli appositi lock che permettano di mantenere coerenza sulla struttura dati. Il problema è ovviamente quello di poter eseguire una sola azione senza concorrenza di accesso: tutte le richieste fatte quando già un thread è al lavoro sull’istanza di FMDatabase vengono sistematicamente ignorate.

Se non si è interessati all’ordine di esecuzione delle operazioni è possibile risolvere il problema facilmente modificando qualche riga dei sorgenti. In particolare agiamo su tutte le occorrenze di:

if (inUse) {
    [self compainAboutInUse];
    return NO;
}

Sostituendole con:

while (inUse) {
    usleep(50);
}

In questo modo l’esecuzione dello statement proveniente da un altro thread si mette in pausa per 50 millisecondi fintanto che il db non è pronto a ricevere una nuova azione.
Ovviamente non abbiamo realizzato una vera e propria concorrenza ma è comunque un modo rapido per non affrontare soluzioni più complicate.


Potrebbero interessarti anche :

Possono interessarti anche questi articoli :