Domanda

Le scrivo un'applicazione per iPhone - un client per un po 'di social network. Il supporto applicazione più account. Informazioni sugli account sono memorizzati in un archivio con chiave.

Un metodo utilizzato per il risparmio:

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

Un metodo utilizza per la lettura:

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

Il metodo saveAccounts viene utilizzato solo se si aggiunge un po 'di conto / modificato / cancellato. Il metodo loadAccounts viene utilizzato ogni volta che si avvia l'applicazione. Non c'è nessun altro codice che accedere a questo file.

I e uno dei miei tester ottengo un problema. Ad un certo momento, inizia a comportarsi come accounts.bin manca. Se loadAccounts ritorna nil, l'applicazione offre per aggiungere un account. Dopo Entro un account (l'applicazione deve chiamare saveAccounts), l'applicazione funziona normalmente, ma quando lancio di nuovo, mi chiede di aggiungere di nuovo conto. Le uniche soluzioni sono troppo reinstallare l'applicazione per iPhone, dopo reinstallare funziona per qualche tempo con eventuali problemi.

(I e il mio tester che ottengono un problema) utilizziamo iPhone 3G con 3.1.2. Un tester un altro che non ha vissuto questo problema sul suo iPhone 3GS con 3.1.2.

Tutte le idee perché questo file scompare?

Aggiornamento

Ho trovato bug nel mio codice. C'era un codice che elimina directory intero documento. Perché questa parte del codice è un server remoto connessi, è stato difficile rintracciare questo codice. Bug è apparso sotto solo patologie molto rare.

Ora il bug viene trovato, e il codice è corretto. La risposta di WKW non ha risolto il mio problema, ma mi ha costretto a scavare più a fondo. Grazie!

È stato utile?

Soluzione

Come su - come un dispositivo di debug --verifying il contenuto della directory Documenti in loadAccounts o almeno ogni volta che i rendimenti Unarchiver zero. C'è un po 'di codice sottostante per ottenere i nomi dei file in una directory. Impostare un punto di interruzione e basta eseguire il dump dei NSArray per visualizzare gli articoli.
Se si può vedere che il file esiste nel Docs dir, allora il problema è altrove. Forse non ha fatto con successo archivio. controllare il valore restituito sulla chiamata per archiviare i dati:

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

Ottieni nomi dei file nella directory:

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

Forse NSUserDefaults potrebbe essere più facile da usare?

Inoltre, c'è un motivo per utilizzare con chiave (Un) Archiver invece di writeToFile di NSArray?

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

e di leggere il file in:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top