Pregunta

Estoy escribiendo una aplicación para iPhone, un cliente para algunas redes sociales. La aplicación admite múltiples cuentas. La información sobre las cuentas se almacena en un archivo clave.

Un método utilizado para guardar:

- (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 método utiliza para leer:

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

El método saveAccounts se usa solo si se agrega/modifica/elimina alguna cuenta. El método loadAccounts se usa cada vez que comienza la aplicación. No hay ningún otro código que acceda a este archivo.

Yo y uno de mis probadores tenemos un problema. En algún momento comienzan a actuar como accounts.bin Está perdido. Si loadAccounts devoluciones nil, la aplicación ofrece agregar una cuenta. Después de ingresar a una cuenta (la aplicación debe llamar saveAccounts), la aplicación funciona normalmente, pero cuando la lance nuevamente, me pide que agregue una cuenta nuevamente. La única soluciones es reinstalar la aplicación en iPhone, después de reinstalar, funciona durante algún tiempo con cualquier problema.

Nosotros (yo y mi probador que tenemos un problema) usamos iPhone 3G con 3.1.2. Otro probador que no experimentó este problema en su iPhone 3GS con 3.1.2.

¿Alguna idea por qué desaparece este archivo?

actualizar

Encontré un error en mi código. Había un código que elimina el directorio de documentos completos. Debido a que esta parte de un código es un servidor remoto relacionado, era difícil rastrear este código. El error apareció solo en condiciones muy raras.

Ahora se encuentra el error y el código se corrige. La respuesta de WKW no resolvió mi problema, pero me obligó a profundizar. ¡Gracias!

¿Fue útil?

Solución

¿Qué tal, como dispositivo de depuración, que verifica el contenido de su directorio de documentos en LoadAccounts o al menos cuando el Unarchiver devuelve nulo. Hay algún código a continuación para obtener los nombres de los archivos en un directorio. Establezca un punto de interrupción y simplemente descarte el nsArray para ver los elementos.
Si puede ver que el archivo existe en Docs Dir, entonces su problema está en otro lugar. Quizás no archivó con éxito. Verifique el valor de retorno en la llamada para archivar los datos:

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

Obtenga nombres de archivos en el directorio:

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

¿Quizás nsuserDefaults podría ser más fácil de usar?

Además, ¿hay alguna razón para usar el Archiver Keyed (ONU) en lugar del WriteToFile de Nsarray?

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

y para leer el archivo en:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top