Как я могу сохранить изображение в папку tmp моего приложения? - PullRequest
21 голосов
/ 16 сентября 2011

Почему, если я использую NSTemporaryDirectory для сохранения изображения, оно сохраняется в

/ var / folder / oG / oGrLHcAUEQubd3CBTs-1zU +++ TI / -Tmp- /

, а не в

/ Пользователи / MyMac / Библиотека / Поддержка приложений / iPhone Simulator / 4.3.2 / Приложения / A685734E-36E9-45DD-BBE7-0A46F8F91DAF / tmp

Вот мой код:

-(NSString *)tempPath
{
    return NSTemporaryDirectory();
}

-(void) saveMyFoto
{
    NSString *urlNahledu = [NSString stringWithFormat:@"%@%@%@",@"http://www.czechmat.cz", urlFotky,@"_100x100.jpg"];
    NSLog(@"%@", urlNahledu);


    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlNahledu]]];

    NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image, 0.8f)];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSLog(@"%@    %@", paths, [self tempPath]);

    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];

    [data writeToFile:localFilePath atomically:YES];
}

Ответы [ 3 ]

49 голосов
/ 19 августа 2012

Это предпочтительный метод, который использует URL-адреса для получения ссылки непосредственно на каталог tmp, а затем возвращает URL-адрес файла (pkm.jpg) для этого каталога:

Swift 4.1

let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
    .appendingPathComponent("pkm", isDirectory: false)
    .appendingPathExtension("jpg")

// Then write to disk
if let data = UIImageJPEGRepresentation(image, 0.8) {
    do {
        try data.write(to: url)
    } catch {
        print("Handle the error, i.e. disk can be full")
    }
}

Swift 3.1

let tmpURL = try! URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
                    .appendingPathComponent("pkm")
                    .appendingPathExtension("jpg")
print("Filepath: \(tmpURL)")

Обратите внимание, что возможная ошибка не обрабатывается!

Swift 2.0

let tmpDirURL = NSURL.fileURLWithPath(NSTemporaryDirectory(), isDirectory: true)
let fileURL = tmpDirURL.URLByAppendingPathComponent("pkm").URLByAppendingPathExtension("jpg")
print("FilePath: \(fileURL.path)")

Objective-C

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

Обратите внимание, что некоторые методы по-прежнему запрашивают путь в виде строки, а затем используют [fileURL path], чтобы вернуть путь в виде строки (как показано выше в NSLog). При обновлении текущего приложения все файлы в папках:

<Application_Home>/Documents/
<Application_Home>/Library/

гарантированно будет сохранено из старой версии (исключая подкаталог <Application_Home>/Library/Caches). Используйте папку Documents для файлов, к которым пользователь может иметь доступ, и папку Library для файлов, которые использует приложение, и которые пользователь не должен видеть.


Другим более длинным способом может быть получение URL-адреса в каталоге tmp, сначала получая каталог Document и удаляя последний компонент path, а затем добавляя папку tmp:

NSURL *documentDir = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSURL *tmpDir = [[documentDir URLByDeletingLastPathComponent] URLByAppendingPathComponent:@"tmp" isDirectory:YES];
NSLog(@"tmpDir: %@", [tmpDir path]);

Тогда мы можем обратиться к файлу, то есть pkm.jpg, как показано здесь:

NSString *fileName = @"pkm";
NSURL *fileURL = [tmpDir URLByAppendingPathComponent:fileName isDirectory:NO];
fileURL = [fileURL URLByAppendingPathExtension:@"jpg"];

То же самое может быть достигнуто с помощью строк, которые использовались ранее в старых системах iOS, но первый метод URL выше является рекомендуемым (если вы не пишете в более старые системы: iPhone OS 2 или 3):

NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"];
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"];
3 голосов
/ 16 сентября 2011

Потому что приложения, работающие в симуляторе, на самом деле не помещаются в песочницу, как на устройствах iOS. В симуляторе временный каталог из Mac OS возвращается в NSTevenDirectory () - на устройстве iOS временный каталог действительно находится в песочнице. Эта разница не должна касаться вас как разработчика приложения.

0 голосов
/ 16 сентября 2011

Если вы хотите сохранить ваши изображения в / Users / MyMac / Библиотека / Поддержка приложений / iPhone Simulator / 4.3.2 / Applications / A685734E-36E9-45DD-BBE7-0A46F8F91DAF / tmp

, используйте nshomedirectory(), который дает вам местоположение до / Users / MyMac / Библиотека / Поддержка приложений / iPhone Simulator / 4.3.2 / Applications / A685734E-36E9-45DD-BBE7-0A46F8F91DAF, тогда вы просто помещаете / tmp и сохраняете ваши изображения.

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                     NSUserDomainMask, YES); 
NSString* docDir = [paths objectAtIndex:0];
NSString* file = [docDir stringByAppendingString:@"/tmp"];
...