2011-09-16 19 views
20

¿Por qué es que si uso NSTemporaryDirectory para salvar mi imagen, la imagen se guarda en¿Cómo puedo guardar una imagen en el directorio tmp de mi aplicación?

/var/carpetas/og/oGrLHcAUEQubd3CBTs-1zU +++ TI/-Tmp-/

y no en

/Usuarios/mymac/Application Support/Library/simulador de iPhone/4.3.2/Aplicaciones/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

Aquí está mi código:

-(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]; 
} 
+1

Este post explicar todos los directorios de aplicación de iOS, guardar, eliminar http://kmithi.blogspot.in/2012/08/ios-application-directory-structure.html – mithilesh

+0

'UIImageJPEGRepresentation()' 'ya vuelve NSData * '- ¿Por qué lo pasaste a' dataWithData: 'antes de usarlo? Me pregunto si sabes algo que yo no ... – ArtOfWarfare

Respuesta

3

Debido a que las aplicaciones en ejecución en el simulador no son realmente sandboxed al igual que en los dispositivos IOS. En el simulador, se devuelve un directorio temporal de Mac OS en NSTemporaryDirectory(): en un dispositivo iOS, el directorio temporal está realmente dentro del entorno limitado. Esa diferencia no debería preocuparlo como desarrollador de aplicaciones.

-2

Si desea almacenar sus imágenes en/Usuarios/mymac/Library/Application Support/simulador de iPhone/4.3.2/Aplicaciones/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

a continuación, utilizar nshomedirectory () que le dan ubicación hasta/Users/MyMac/Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF, entonces simplemente coloca/tmp y almacena sus imágenes.

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

Esto no funciona y el texto habla de NSHomeDirectory() y el código usa NSDocumentDirectory por lo tanto, el directorio/tmp formará parte del directorio de Documentos que es incorrecto. –

47

Este es el método preferido que utiliza la dirección URL de obtener un enlace directamente al directorio tmp y luego devuelve una dirección de fichero (pkm.jpg) para ese directorio:

Swift 4.0

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

// Then write to disk 
if let url = tmpURL, let data = UIImageJPEGRepresentation(image, 0.8) { 
    // Use do-catch for error handling, disk can be full etc. 
    try? data.write(to: url) 
} 

Swift 3,1

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

¡Tenga en cuenta que no se maneja un posible error!

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]); 

Tenga en cuenta que algunos métodos todavía solicitar una ruta como una cadena, a continuación, utilizar el [fileURL path] a devolver la ruta como una cadena (como se mostrado arriba en NSLog). Al actualizar la aplicación de una corriente de todos los archivos en las carpetas:

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

están garantizados para ser preservado de la versión anterior (excluyendo la <Application_Home>/Library/Caches subdirectorio). Utilice la carpeta Documents para los archivos a los que desee que tenga acceso el usuario y la carpeta Library para los archivos que utiliza la aplicación y el Usuario no debe ver.


Otra ya manera podría ser la de obtener una URL para el directorio tmp, por primera vez obtener el directorio de documentos y pelar el último componente de la ruta y luego añadir la carpeta tmp:

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

Entonces podemos abordar un archivo existe, es decir pkm.jpg como se muestra aquí:

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

Lo mismo se puede lograr con cadenas, que se usaba en los sistemas iOS anteriores, pero el primer método URL anterior es el recomendado ahora (a menos que esté escribiendo en sistemas anteriores: iPhone OS 2 o 3):

NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"]; 
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"]; 
+0

No puedo obtener archivos de 'NSTemporaryDirectory()' cuando es un archivo de video .mp4. Funciona perfecto para audio e imagen. Ayuda – jose920405

+0

@ jose920405 Realmente no entiendo su problema, pero puede tener que ver con si el archivo es compatible con iOS. –

+0

'isDirectory' es importante – onmyway133

Cuestiones relacionadas