2012-06-22 15 views
6

Estoy descargando un archivo SQLite db de la web en mi aplicación para iPad. Si lo escribo en la configuración del disco atomically: YES no puedo usarlo inmediatamente porque aunque el archivo esté allí, sqlite se queja de que las tablas no están allí. Si utilizo atomically = NO o retraso la apertura del archivo unos instantes, entonces no tengo este problema.NSData writeToFile: atómicamente: no guarda inmediatamente el archivo

supongo que podría ir sobre ella mediante el establecimiento de atomically = NO pero por otra parte es existe algún tipo de garantía de que todo el archivo se ha escrito en el disco inmediatamente después de la WriteToFile: llamar? Hasta ahora, mi DB no es tan grande, pero con el tiempo, y no sé cuánto tiempo esperar en otros dispositivos.

Apple dice que este método devuelve YES si la operación tiene éxito pero obviamente eso no tiene en cuenta el "retraso" al guardar el archivo.

¡Cualquier ayuda es muy apreciada!

EDIT: Veo que otras personas están teniendo the same problem.

+0

yo encontramos este hilo desbordamiento de pila que describe la escritura de archivos atómica: http://stackoverflow.com/questions/2705076/difference-between-writing-to-file-atomically-and-not What I Supongo que está intentando acceder al archivo antes de que el SO lo escriba en el almacén permanente. ¿Hay alguna razón por la que tienes que escribir atómicamente? –

+0

Esa fue mi suposición también y estoy tratando de encontrar una manera de evitarlo. La razón por la que tengo que escribir atómicamente es que, si por algún motivo falla, mi principal db se corromperá, haciendo que mi aplicación quede inutilizable. – Julian

+0

¿Cómo estás descargando y escribiendo? –

Respuesta

1

De acuerdo con el enlace, la operación se escribirá por completo o fallará.

Teniendo esto en cuenta, escribe atómicamente en otro subproceso y luego ¡haz algo como esto!

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

[NSThread sleepForTimeInterval:.5]; 

} 
+0

Nick, el problema es que el archivo EXISTE, pero el contenido no está completamente escrito cuando el método devuelve SÍ, por lo que esta solución no funcionará (¡pero gracias por la idea de todos modos!) – Julian

+0

¿Puede poner una llamada de bloqueo en colocar mientras el archivo está escribiendo? También puede usar un ciclo while y verificar el hash del archivo que se está escribiendo en comparación con el archivo descargado. –

+0

¿Cómo se hace una llamada de bloqueo? El hash probablemente funcionará pero creo que es excesivo para una tarea tan común como esta (y en algunas descargas no controlo lo que se me envía, así que no puedo incluir el hash). Me sorprende que nadie haya informado algo como esto. – Julian

Cuestiones relacionadas