Frage

Ich schreibe eine iPhone -App - einen Kunden für ein soziales Netzwerk. Die App unterstützt mehrere Konten. Informationen zu Konten werden in einem Keyed -Archiv gespeichert.

Eine Methode zum Speichern:

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

Eine Methode zum Lesen verwendet:

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

Die Methode saveAccounts wird nur verwendet, wenn ein Konto hinzugefügt/geändert/gelöscht wird. Die Methode loadAccounts wird jedes Mal verwendet, wenn die App startet. Es gibt keinen anderen Code, der auf diese Datei zugreift.

Ich und einer meiner Tester bekommen ein Problem. Irgendwann beginnt sich die zu verhalten wie wie accounts.bin wird vermisst. Wenn loadAccounts kehrt zurück nil, Die App bietet an, ein Konto hinzuzufügen. Nachdem ich ein Konto eingegeben habe (die App muss anrufen saveAccounts), die App funktioniert normal, aber wenn ich sie erneut starte, fordert ich mich auf, Konto erneut hinzuzufügen. Die einzigen Lösungen sind zu sehr, die App auf das iPhone neu zu installieren, nachdem sie neu installiert ist, funktioniert sie für einige Zeit mit Problemen.

Wir (ich und mein Tester, die ein Problem bekommen) verwenden iPhone 3G mit 3.1.2. Ein weiterer Tester, der dieses Problem auf seinem iPhone 3GS mit 3.1.2 nicht erlebt hat.

Irgendwelche Ideen, warum diese Datei verschwindet?

aktualisieren

Ich habe Fehler in meinem Code gefunden. Es gab einen Code, der das gesamte Dokumentverzeichnis löscht. Da dieser Teil eines Codes ein Remote -Server ist, war es schwierig, diesen Code zu verfolgen. Der Fehler trat nur unter sehr seltenen Bedingungen auf.

Jetzt wird der Fehler gefunden und der Code korrigiert. WKWs Antwort löste mein Problem nicht, aber es zwang mich, tiefer zu graben. Vielen Dank!

War es hilfreich?

Lösung

Wie wäre es -als Debugging -Gerät -die Inhalt Ihres Dokumenteverzeichnisses in LoadAccounts oder zumindest wenn der Unarchiver NIL zurückgibt. Im Folgenden finden Sie einen Code, um die Namen von Dateien in einem Verzeichnis zu erhalten. Stellen Sie einen Haltepunkt fest und lassen Sie das NSArray einfach ab, um die Elemente anzuzeigen.
Wenn Sie sehen können, dass die Datei im DOCS -DIR existiert, liegt Ihr Problem an anderer Stelle. Vielleicht hat es nicht erfolgreich archiviert. Überprüfen Sie den Rückgabewert auf dem Anruf, um die Daten zu archivieren:

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

Erhalten Sie Namen von Dateien im Verzeichnis:

- (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;
}

Vielleicht können NsuserDefaults einfacher zu bedienen sein?

Gibt es auch einen Grund, KEY -Archiver (UN-) Archiver anstelle von Nsarrays WritToFile zu verwenden?

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

und um die Datei in: zu lesen:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top