Observe que escribir NSData
en un archivo es una operación IO que puede bloquear el hilo principal. Especialmente si el objeto de datos es grande.
Por lo tanto, se aconseja llevar a cabo esto en un subproceso en segundo plano, la forma más fácil sería utilizar GCD de la siguiente manera:
// Use GCD's background queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Generate the file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.dat"];
// Save it into file system
[data writeToFile:dataPath atomically:YES];
});
Tenga cuidado con los problemas de endian. –
¿El origen del objeto 'NSData' es importante para este método? [En esta pregunta] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Estoy guardando una base de datos .sqlite que descargué en un objeto 'NSData' de una URL, pero no parece guardarlo correctamente El archivo está escrito, pero cuando intento acceder a él (ya sea a través de mi aplicación o con un visor de terceros) me dice que no es una base de datos SQLite válida. ¿'WriteToURL: atómicamente:' solo funciona para guardar 'NSString's o algo así? – GeneralMike
'NSData' es un contenedor para cualquier clase de datos binarios. La fuente original no debería importar. En cuanto a su pregunta, le recomiendo usar 'NSURLConnection' (o una biblioteca como' AFNetworking') sobre 'initWithContentsOfURL:'. Para pequeñas descargas, 'NSData' puede estar bien, pero no proporciona ningún control sobre la descarga. Cuando algo sale mal, esto hace que sea difícil diagnosticar el problema. – Alex