2011-07-06 4 views
2

Dois-je vérifier si un fichier existe à un chemin donné lorsque j'essaie de lire les données dans un objet NSData? En ce moment je ne fais pas pour le moment mais mon code fonctionne puisque mon tableau qui est censé être peuplé avec les données du fichier sera mis à zéro et je peux plus tard dans mon application vérifier si ce tableau est nul. Mais je pense que le code est peut-être «moche» et fonctionnerait mieux si je faisais un contrôle (comme celui du code commenté).Objective-C NSData initWithContentsOfFile, vérifie si le fichier existe?

NSData *codedData = [[NSData alloc] initWithContentsOfFile:[CareersParser dataFilePath]]; 

    /* 
    if (codedData != nil) { 
     //do the below (not commented out code) 
    } else { 

     //file doesn't exist at the given path 
     [codedData release]; 
     return nil; 
    } 
    */ 

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:codedData]; 
    NSArray *careers = [unarchiver decodeObjectForKey:kDataKey];  
    [unarchiver finishDecoding]; 

    NSMutableArray *ids = [[NSMutableArray alloc] init]; 

    for (Career *career in careers) { 
     [ids addObject:[career id]]; 
    } 

    // Sort the array in an orderly fashion 
    NSArray *sortedIds = [ids sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

    // Release allocated memory 
    [ids release]; 
    [unarchiver release]; 
    [codedData release]; 

    return sortedIds; 

Répondre

2

Cela me semble logique d'inverser l'instruction if pour supprimer la clause else.

if (nil == codedDate) { 
    [codedData release]; 
    return nil; 
} 

... Do the rest of your code 

d'Apple suggère here que vous devriez essayer d'effectuer une opération telle que le chargement de données comme vous l'avez suggéré. Tant que vous n'essayez pas de faire [[NSManager defaultManager] fileExistsAtPath:path], vous n'introduisez pas de conditions de course.

+0

Comment une situation de course se produirait-elle en utilisant la méthode 'fileExistsAtPath'? –

+0

Le premier exemple que je peux penser est si vous utilisez 'fileExistsAtPath' pour vérifier que votre structure de répertoire requise est configurée par exemple. 'Documents/myAppFiles/test.txt' lors de la réception de' YES' vous pourriez être heureux et aller de l'avant et enregistrer le fichier. Il est possible que, entre votre vérification et l'opération de sauvegarde, un thread d'arrière-plan arrive et supprime la structure de répertoire sur laquelle vous dépendez, ce qui empêcherait votre fichier de sauvegarder. Il y a plus d'informations dans les docs apple http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html –

1

Vous n'avez pas, et cela pourrait introduire une course, donc ce sera plus "moche". Vérifiez simplement si codedData s'il est nul en cas d'échec de lecture.

Questions connexes