Самый простой способ записи NSData в файл - PullRequest
64 голосов
/ 24 марта 2009
NSData *data;
data = [self fillInSomeStrangeBytes];

Теперь у меня вопрос, как я могу написать data о самом простом пути к файлу.

(у меня уже есть NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes)

Ответы [ 4 ]

98 голосов
/ 24 марта 2009

NSData имеет метод с именем writeToURL:atomically:, который делает именно то, что вы хотите сделать. Посмотрите в документацию для NSData, чтобы узнать, как ее использовать.

31 голосов
/ 26 мая 2014

Обратите внимание, что запись 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];
});
30 голосов
/ 24 марта 2009

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

1 голос
/ 15 февраля 2018

У вас также есть 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;
}
...