Question

J'écris une application iPhone - un client pour un réseau social. L'application prend en charge plusieurs comptes. Les informations sur les comptes sont stockées dans une archive à clé.

Une méthode utilisée pour enregistrer:

- (void) saveAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 // NSMutableArray *accounts = ...;
 [NSKeyedArchiver archiveRootObject:accounts toFile:path];
}

Une méthode utilise la lecture:

- (NSMutableArray *) loadAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 NSMutableArray *restoredAccounts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
 return [restoredAccounts retain];
}

La méthode saveAccounts est utilisé uniquement si un compte est ajouté / modifié / supprimé. La méthode loadAccounts est utilisé à chaque fois que l'application commence. Il n'y a aucun autre code qui accède à ce fichier.

Moi et l'un de mes testeurs obtenons un problème. À un moment donné, le début à agir comme accounts.bin est manquant. Si loadAccounts Retour nil, l'application propose d'ajouter un compte. Après avoir saisi un compte (l'application doit appeler saveAccounts), l'application fonctionne normalement, mais lorsque je le lance à nouveau, il me demande d'ajouter à nouveau le compte. Les seules solutions consistent à réinstaller l'application sur iPhone, après avoir réinstallé, cela fonctionne pendant un certain temps avec des problèmes.

Nous (moi et mon testeur qui obtenons un problème) utilisons l'iPhone 3G avec 3.1.2. Un autre testeur qui n'a pas rencontré ce problème sur son iPhone 3GS avec 3.1.2.

Des idées pourquoi ce fichier disparaît?

mettre à jour

J'ai trouvé un bug dans mon code. Il y avait un code qui supprime le répertoire de documents entiers. Étant donné que cette partie d'un code est liée au serveur distant, il était difficile de retracer ce code. Le bug est apparu dans des conditions très rares uniquement.

Maintenant, le bogue est trouvé et le code est corrigé. La réponse de WKW n'a pas résolu mon problème, mais cela m'a forcé à creuser plus profondément. Merci!

Était-ce utile?

La solution

Que diriez-vous - en tant que dispositif de débogage - vérifier le contenu de votre répertoire de documents dans LoadAccouts ou du moins chaque fois que le Unarchiver renvoie nul. Il y a du code ci-dessous pour obtenir les noms des fichiers dans un répertoire. Réglez un point d'arrêt et videz simplement le NSARRAY pour afficher les éléments.
Si vous pouvez voir que le fichier existe dans le DOCS DIR, alors votre problème est ailleurs. Peut-être qu'il n'a pas réussi à archiver. Vérifiez la valeur de retour sur l'appel pour archiver les données:

if( ! [NSKeyedArchiver archiveRootObject:accounts toFile:path] ){
    NSLog(@"Oooops! account data failed to write to disk");
}

Obtenez des noms de fichiers dans le répertoire:

- (NSArray*) directoryContentsNames:(NSString*) directoryPath {
    NSArray* result;
    {
        result = [[NSFileManager defaultManager]
            directoryContentsAtPath: directoryPath];
    }
    if( result && [result count] > 0 ){
        NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
        for( NSString *name in result ){
            if( ! [name isEqualToString:@".DS_Store"] )
                [items addObject: name];
        }
        result = items;

    }
    return result;
}

Peut-être que NSUSERDEFAULTS pourrait être plus facile à utiliser?

En outre, y a-t-il une raison d'utiliser un archiver Keyed (non) au lieu de WriteTofile de NSArray?

if( ! [accounts writeToFile:path atomically:YES] )
    ; // do something since write failed

et pour lire le fichier dans:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top