2015-11-16 3 views
1

Я загружаю то, что может быть большим файлом из ведра S3, и хочу сохранить его между контроллерами представлений, которые будут потребляться через некоторое время. Мне нравится каталог tmp из-за меньших ограничений на размер файла, и, похоже, для меня это не является причиной сохранения в каталоге Documents.Как скопировать содержимое NSData во временный файл?

Я могу построить путь к tmp с:

 NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; 
     NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"image"] URLByAppendingPathExtension:@"png"]; 
     NSLog(@"fileURL: %@", [fileURL path]); 

, но не уверен, как писать/переписывать загруженный NSData * на этот путь.

я в основном просто хочу, что я могу более четко выразить с помощью командной строки:

wget https://example.com/image.png 
cp image.png /tmp/ 

Похоже ссылки класса может выставить метод, чтобы сделать только это:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/

EDIT

Мое решение, которое работает. Закончилось то, что мне нужно было использовать writeToURL. Вдохновение взято отсюда: http://nshipster.com/nstemporarydirectory/ https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/occ/clm/NSURL/fileURLWithPath:isDirectory:

#define S3_LATEST_IMAGE_FILEPATH @"test-image.png" 

    // Write the downloaded result to the filesystem 
    NSError *error; 
    NSString *fileName = [NSString stringWithFormat:@"%@_%@", [[NSProcessInfo processInfo] globallyUniqueString], S3_LATEST_IMAGE_FILEPATH]; 
    NSURL *directoryURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]] isDirectory:YES]; 
    [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL withIntermediateDirectories:YES attributes:nil error:&error]; 
    if (error) { 
     NSLog(@"Error1: %@", error); 
     return; 
    } 
    NSURL *fileURL = [directoryURL URLByAppendingPathComponent:fileName]; 

    NSString *path = fileURL.absoluteString; 
    NSLog(@"fileURL.absoluteString: %@", path); 
    [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; 
    if (error) { 
     NSLog(@"Error: %@", error); 
    } 

ответ

2

Вы можете непосредственно записать NSData в путь по

NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; 
NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"newest-fw"] URLByAppendingPathExtension:@"zip"]; 
NSString *path= fileURL.absoluteString; 
//data would be the NSData that you get from the S3 bucket 
NSError *error; 
[[NSFileManager defaultManager] createDirectoryAtURL: fileURL withIntermediateDirectories:NO attributes:nil error:&error]; 
[data writeToFile:path options:NSDataWritingAtomic error:&error]; 

метод WriteToFile NSData будет автоматически перезаписывать файл, если он ранее присутствует.

+1

Я получаю сообщение об ошибке: 'Ошибка: Ошибка домена = NSCocoaErrorDomain Code = 4" Файл "image.png" не существует. "UserInfo = {NSFilePath = file: /// private/var/mobile/Containers /Data/Application/809801E6-94AD-4EEA-91D1-6C74155E9396/tmp/image.ping, NSUnderlyingError = 0x146dd6760 {Error Domain = NSPOSIXErrorDomain Code = 2 «Нет такого файла или каталога»}} ' – tarabyte

+0

Если ваш путь содержит все новые каталоги то сначала вы должны создать каталоги, прежде чем писать. Я обновил свой ответ, пожалуйста, проверьте – iPrabu

+0

Хм. Я смотрел на это. Не решает. Файл определенно также создается в корне каталога tmp (нет подкаталоги в пути). – tarabyte

Смежные вопросы