Pergunta

Estou escrevendo um aplicativo para iPhone - um cliente para alguma rede social. O aplicativo suporta várias contas. As informações sobre contas são armazenadas em um arquivo com chave.

Um método usado para salvar:

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

Um método usa para leitura:

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

O método saveAccounts é usado apenas se alguma conta for adicionada/modificada/excluída. O método loadAccounts é usado toda vez que o aplicativo inicia. Não há outro código que acesse este arquivo.

Eu e um dos meus testadores obtemos um problema. Em algum momento o início a agir como accounts.bin está desaparecido. Se loadAccounts retorna nil, o aplicativo se oferece para adicionar uma conta. Depois de inserir uma conta (o aplicativo deve ligar saveAccounts), o aplicativo funciona normalmente, mas quando eu o inicio novamente, ele me pede para adicionar uma conta novamente. As únicas soluções são muito reinstalar o aplicativo para o iPhone, depois de reinstalar ele funciona por algum tempo com problemas.

Nós (eu e meu testador que obtemos um problema) Usamos o iPhone 3G com 3.1.2. Outro testador que não teve esse problema em seu iPhone 3GS com 3.1.2.

Alguma idéia de por que esse arquivo desaparece?

atualizar

Encontrei bug no meu código. Havia um código que exclui o diretório de documentos inteiros. Como essa parte de um código é relacionada ao servidor remoto, era difícil rastrear esse código. O bug apareceu apenas em condições muito raras.

Agora o bug é encontrado e o código é corrigido. A resposta da WKW não resolveu meu problema, mas me forçou a cavar mais fundo. Obrigada!

Foi útil?

Solução

Que tal -como um dispositivo de depuração -verificando o conteúdo do seu diretório de documentos no LoadAccounts ou pelo menos sempre que o Unchiver retornar nulo. Há algum código abaixo para obter os nomes dos arquivos em um diretório. Defina um ponto de interrupção e basta despejar o NSARRAY para visualizar os itens.
Se você puder ver que o arquivo existe no Docs Dir, seu problema está em outro lugar. Talvez não tenha arquivado com sucesso. Verifique o valor de retorno na chamada para arquivar os dados:

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

Obtenha nomes de arquivos no diretório:

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

Talvez os nsuserdefaults possam ser mais fáceis de usar?

Além disso, existe uma razão para usar o arquiver (un) com chave em vez do WRITETOFILE DE NSARRAY?

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

e ler o arquivo em:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top