Si noti che la scrittura di NSData
in un file è un'operazione IO che potrebbe bloccare il thread principale. Soprattutto se l'oggetto dati è grande.
Pertanto si consiglia di eseguire questo su un thread in background, il modo più semplice sarebbe quella di utilizzare GCD come segue:
// 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];
});
fonte
2014-05-26 06:09:25
Attenzione per problemi di endian. –
La sorgente dell'oggetto 'NSData' è importante per questo metodo? [In questa domanda] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Sto salvando un database .sqlite che ho scaricato in un oggetto 'NSData' da un URL, ma sembra che non lo stia salvando correttamente. Il file è scritto, ma quando provo ad accedervi (tramite la mia app o con un visualizzatore di terze parti) mi dice che non è un database SQLite valido. 'WriteToURL: atomically:' funziona solo per salvare 'NSString's o qualcosa del genere? – GeneralMike
'NSData' è un wrapper per qualsiasi tipo di dati binari. La fonte originale non dovrebbe importare. Osservando la tua domanda, ti consiglio di usare 'NSURLConnection' (o una libreria come' AFNetworking') su 'initWithContentsOfURL:'. Per piccoli download, 'NSData' può andare bene, ma non fornisce alcun controllo sul download. Quando qualcosa va storto, questo rende difficile diagnosticare il problema. – Alex