2012-06-22 5 views
6

Sto scaricando un db SQLite dal web nella mia app per iPad. Se lo scrivo sull'impostazione del disco atomically: YES non riesco a usarlo immediatamente perché anche se il file è lì, sqlite si lamenta che le tabelle non ci sono. Se utilizzo atomically = NO o ritardo l'apertura del file pochi istanti, non ho questo problema.NSData writeToFile: atomically: non salva immediatamente il file

Credo che avrei potuto andare su di esso impostando atomically = NO ma poi di nuovo c'è una sorta di garanzia che l'intero file è stato scritto su disco subito dopo il writeToFile: chiamare? Finora il mio db non è così grande ma alla fine, in più non so per quanto tempo aspettare in altri dispositivi.

I documenti Apple dicono che questo metodo restituisce YES se l'operazione ha esito positivo ma ovviamente non tiene conto del "ritardo" che salva il file.

Qualsiasi aiuto è molto apprezzato!

MODIFICA: vedo altre persone stanno avendo the same problem.

+0

ho trovato questa discussione overflow dello stack che descrive la scrittura di file atomica: http://stackoverflow.com/questions/2705076/difference-between-writing-to-file-atomically-and-not Quello che ho' Sto indovinando, stai cercando di accedere al file prima che il sistema operativo lo scriva nell'archivio permanente. C'è una ragione per cui devi assolutamente scrivere atomicamente? –

+0

Questa era la mia ipotesi e sto cercando di capire come aggirarla. La ragione per cui devo scrivere atomicamente è che se per qualche ragione la cosa si blocca il mio db principale verrà danneggiato, rendendo la mia app inutilizzabile. – Julian

+0

Come stai scaricando e scrivendo? –

risposta

1

In base al collegamento, l'operazione scriverà completamente o fallirà.

Con questo in mente, scrivere atomicamente su un altro thread, e quindi fare qualcosa di simile!

while (![[FileManager defaultFileManager] fileExistsAtPath:yourEventualDBPath]) { 

[NSThread sleepForTimeInterval:.5]; 

} 
+0

Nick, il problema è che il file ESISTE ma i contenuti non sono stati scritti completamente nel momento in cui il metodo restituisce SÌ, quindi questa soluzione non funzionerà (ma comunque grazie per l'idea!) – Julian

+0

Puoi mettere una chiamata bloccante in posto mentre il file sta scrivendo? Puoi anche utilizzare un ciclo while e controllare l'hash del file che viene scritto rispetto al file scaricato? –

+0

Come si fa una chiamata di blocco? L'hash probabilmente funzionerà, ma penso che sia eccessivo per un compito così comune come questo (e su alcuni download non controllo ciò che mi viene inviato in modo da non poter includere l'hash). Sono sorpreso che nessuno abbia riportato nulla di simile. – Julian