Zauważ, że wpisanie NSData
do pliku jest operacją we/wy, która może zablokować główny wątek. Zwłaszcza, gdy obiekt danych jest duży.
Dlatego zaleca się wykonać to na wątku tła, najprostszym sposobem będzie użycie GCD następująco:
// 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];
});
Uważaj na problemy endian. –
Czy źródło obiektu 'NSData' ma znaczenie dla tej metody? [W tym pytaniu] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Zapisuję bazę danych .sqlite, którą pobrałem do obiektu 'NSData' z adresu URL, ale wygląda na to, że nie zapisuje go poprawnie. Plik jest zapisany, ale kiedy próbuję uzyskać do niego dostęp (za pośrednictwem mojej aplikacji lub przeglądarki innej firmy), mówi mi, że nie jest to poprawna baza danych SQLite. Czy 'writeToURL: atomically:' działa tylko dla zapisu 'NSString's czy coś w tym stylu? – GeneralMike
'NSData' jest opakowaniem dla dowolnego rodzaju danych binarnych. Oryginalne źródło nie powinno mieć znaczenia. Patrząc na twoje pytanie, polecam używanie 'NSURLConnection' (lub biblioteki takiej jak' AFNetworking') zamiast 'initWithContentsOfURL:'. W przypadku małych pobrań, 'NSData' może być w porządku, ale nie zapewnia żadnej kontroli nad pobieraniem. Gdy coś pójdzie nie tak, trudno będzie zdiagnozować problem. – Alex