2011-10-10 3 views
0

J'utilise le sélecteur de photo pour parcourir et choisir une vidéo, et une fois qu'il est sélectionné, je le déplace du stockage temporaire dans mon répertoire de travail pour une utilisation future. Je le fais en utilisant la ligne suivante:Pic de mémoire avec MoveItemAtPath

[[NSFileManager defaultManager] moveItemAtPath:newName toPath:newPath error:nil]; 

Quand je profil l'application, au cours de ce processus, les pics d'utilisation de la mémoire à la taille du fichier vidéo, puis de nouveau vers le bas un instant plus tard. Est-il possible de déplacer ce fichier sans le pic de mémoire? Je suis préoccupé par le crash de mon application si l'appareil de l'utilisateur a beaucoup d'applications en cours d'exécution à ce moment-là.

Si elle aide mes chemins ressemblent: /private/var/mobile/Applications/046F9A22-DBEC-436F-936C-D59945783483/tmp//trim.PK4abv.MOV

/private/var/mobile /Applications/046F9A22-DBEC-436F-936C-D59945783483/Documents/resources/myCards/BC742DC8-A7D4-40B8-8AC8-97CF9F242881/trim.PK4abv.MOV

Répondre

0

Si le pic de mémoire est comparable à la taille du fichier, il se peut qu'il charge la totalité du fichier en mémoire, ce qui peut en effet causer des problèmes si la taille du fichier devient vraiment importante. La façon dont je traite ce problème (lors de la copie/annexant aux fichiers) est de déplacer le fichier en petits morceaux, quelque chose comme ça (bon vieux API fichier C):

#import <sys/stat.h> 

+(BOOL) moveFileAtPath:(NSString*)sourcePath 
      toFileAtPath:(NSString*)targetPath 
     inChunksWithSize:(size_t)bytes { 

    // open target file for appending 
    FILE *targetFile = fopen([targetPath UTF8String], "a"); 
    if(targetFile == NULL) 
     return NO; 

    FILE *sourceFile = fopen([sourcePath UTF8String], "rb"); 
    if(appendFile == NULL) { 
     fclose(targetFile); 
     return NO; 
    } 

    void *data = malloc(bytes); 
    if (data == NULL) { 
     fclose(targetFile); 
     fclose(sourceFile); 
     return NO; 
    } 

    size_t sourceSize = (size_t)filelength(fileno(sourceFile)); 
    off_t currentOffset = 0; 

    while (currentOffset < sourceSize) { 
     fseeko(sourceFile, currentOffset, SEEK_SET); 
     size_t read_bytes = fread(data, 1, bytes, sourceFile); 
     fwrite(data, 1, read_bytes, targetFile); 
     currentOffset += read_bytes; 
     if (read_bytes < 1) 
      break; 
    } 

    free(data); 
    fclose(targetFile); 
    fclose(sourceFile); 

    return YES; 
} 
+0

MERCI BEAUCOUP! Essayer maintenant – box86rowh

+0

Ceci est vraiment exagéré si vous déplacez simplement un fichier existant d'un emplacement à l'autre. Vous pouvez simplement utiliser rename(). C'est ce que NSFileManager devrait faire quand la source et la destination sont sur le même volume, d'où ma réponse. Je serais curieux de voir la sortie de l'activité du système de fichiers (avec backtraces) de votre application. – kperryua

0

Êtes-vous "en mouvement" dans les différents volumes? Si tel est le cas, NSFileManager copiera le fichier vers la destination et supprimera l'original. Cette copie peut causer votre "pic de mémoire".

+0

Non, je me déplace des fichiers temporaires (où les vidéos sont placées lorsque vous les sélectionnez) et mes dossiers de documents pour l'application, c'est sur l'iphone/ipad btw – box86rowh

Questions connexes