2009-03-24 1 views

ответ

94

NSData имеет метод writeToURL:atomically:, что делает именно то, что вы хотите сделать. Просмотрите the documentation for NSData, чтобы узнать, как его использовать.

+1

Остерегайтесь проблем со стороны. –

+1

Имеет ли источник объект NSData для этого метода? [В этом вопросе] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Я сохраняю базу данных .sqlite, которую я загрузил в объект NSData из URL-адреса, но это похоже, не сохраняет его правильно. Файл написан, но когда я пытаюсь получить к нему доступ (через мое приложение или с сторонним зрителю), он говорит мне, что это не действительная база данных SQLite. Является ли 'writeToURL: atomically:' работает только для сохранения 'NSString' или что-то в этом роде? – GeneralMike

+1

'NSData' - это оболочка для любых двоичных данных. Первоначальный источник не должен иметь значения. Рассматривая ваш вопрос, я бы рекомендовал использовать 'NSURLConnection' (или библиотеку типа AFNetworking) над' initWithContentsOfURL: '. Для небольших загрузок «NSData» может быть прекрасным, но он не обеспечивает никакого контроля над загрузкой. Когда что-то идет не так, это затрудняет диагностику проблемы. – Alex

30

writeToURL:atomically: или writeToFile:atomically:, если у вас есть имя файла вместо URL.

+2

+1 для NSURL. NSURL pwns NSString, когда вы указываете на файл. Apple всегда рекомендует NSURL для путей к файлам, а не для NSString. :) – 2011-01-04 12:25:00

+9

Я не думаю, что существует разница между writeToURL и writeToFile. Согласно документации: «Поскольку в настоящее время поддерживаются только файлы: // URL-адреса, нет никакой разницы между этим методом и writeToFile: atomically :, за исключением типа первого аргумента« –

+0

Имеет ли источник объект NSData' для этого метода? [В этом вопросе] (http://stackoverflow.com/questions/16150196/updating-sqlite-database-without-xml) Я сохраняю базу данных .sqlite, которую я загрузил в объект NSData из URL-адреса, но это похоже, не сохраняет его правильно. Файл написан, но когда я пытаюсь получить к нему доступ (через мое приложение или с сторонним зрителю), он говорит мне, что это не действительная база данных SQLite. Является ли 'writeToURL: atomically:' работает только для сохранения 'NSString' или что-то в этом роде? – GeneralMike

28

Обратите внимание, что запись 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]; 
}); 
+1

как его получить? –

+0

['dataWithContentsOfFile:'] (https://developer.apple.com/documentation/foundation/nsdata/1547226-datawithcontentsoffile?language=objc) – Rob

0

Вы также writeToFile:options:error: или writeToURL:options:error:, которые могут сообщить коды ошибок в случае экономии NSData не удалось по какой-либо причине. Например:

NSError *error; 

NSURL *folder = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:true error:&error]; 
if (!folder) { 
    NSLog(@"%s: %@", __FUNCTION__, error);  // handle error however you would like 
    return; 
} 

NSURL *fileURL = [folder URLByAppendingPathComponent:filename]; 
BOOL success = [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; 
if (!success) { 
    NSLog(@"%s: %@", __FUNCTION__, error);  // handle error however you would like 
    return; 
} 
Смежные вопросы