Обратите внимание, что запись NSData
в файл представляет собой операцию ввода-вывода, которая может блокировать основной поток. Особенно, если объект данных большой.
Поэтому рекомендуется выполнить это на фоне потока, проще всего было бы использовать НОД следующим образом:
// 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];
});
Остерегайтесь проблем со стороны. –
Имеет ли источник объект NSData для этого метода? [В этом вопросе] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Я сохраняю базу данных .sqlite, которую я загрузил в объект NSData из URL-адреса, но это похоже, не сохраняет его правильно. Файл написан, но когда я пытаюсь получить к нему доступ (через мое приложение или с сторонним зрителю), он говорит мне, что это не действительная база данных SQLite. Является ли 'writeToURL: atomically:' работает только для сохранения 'NSString' или что-то в этом роде? – GeneralMike
'NSData' - это оболочка для любых двоичных данных. Первоначальный источник не должен иметь значения. Рассматривая ваш вопрос, я бы рекомендовал использовать 'NSURLConnection' (или библиотеку типа AFNetworking) над' initWithContentsOfURL: '. Для небольших загрузок «NSData» может быть прекрасным, но он не обеспечивает никакого контроля над загрузкой. Когда что-то идет не так, это затрудняет диагностику проблемы. – Alex