Самый простой способ записать NSData в файл
Вопрос
NSData *data;
data = [self fillInSomeStrangeBytes];
Теперь у меня вопрос, как мне это написать data
на самом простом пути к файлу.
(У меня уже есть NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes
)
Решение
NSData
есть метод под названием writeToURL:atomically:
это делает именно то, что вы хотите сделать.Заглянуть документация для NSData
чтобы увидеть, как его использовать.
Другие советы
Обратите внимание, что запись NSData
в файл — это операция ввода-вывода, которая может заблокировать основной поток.Особенно, если объект данных большой.
Поэтому рекомендуется выполнять это в фоновом потоке. Самый простой способ — использовать GCD следующим образом:
// 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];
});
writeToURL:атомарно: или writeToFile: атомарно: если у вас есть имя файла вместо URL-адреса.
У вас также есть 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;
}