Самый простой способ записать NSData в файл


NSData *data;
data = [self fillInSomeStrangeBytes];

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

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

4   62   2009-03-24 23:26:08

4 ответа:

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

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

обратите внимание, что писать!--1--> в файл-это операция ввода-вывода, которая может блокировать основной поток. Особенно если объект данных большой.

поэтому рекомендуется выполнять это в фоновом потоке, самый простой способ-использовать 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];
});

у вас тоже есть 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;
}