Descobri uma alternativa: antes de salvar, codifico o objeto raiz ( NSArray
objeto) usando NSKeyedArchiver
, que termina com NSData
. Em seguida, use UserDefaults e salve o NSData
.
Quando preciso dos dados, leio o NSData
e uso NSKeyedUnarchiver
para converter NSData
novamente no objeto.
É um pouco complicado, porque eu preciso converter de / para NSData
sempre, mas funciona.
Aqui está um exemplo por solicitação:
Salve :
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Carga:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
O elemento na matriz implementa
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Em seguida, na implementação de CommentItem
, fornece dois métodos:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
Alguém tem melhor solução?
Obrigado a todos.
Se você estiver salvando um objeto nos padrões do usuário, todos os objetos, recursivamente, até o fim, devem ser objetos da lista de propriedades. Conformidade com NSCoding não significa nada aqui -
NSUserDefaults
não os codificará automaticamenteNSData
, você deve fazer isso sozinho. Se a sua "lista de objetos que implementaNSCoding
" significa objetos que não são objetos da lista de propriedades, será necessário fazer alguma coisa com eles antes de salvar nos padrões do usuário.FYI as classes de lista propriedade são
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, eNSNumber
. Você pode escrever subclasses mutáveis (comoNSMutableDictionary
) nas preferências do usuário, mas os objetos que você ler sempre serão imutáveis.fonte
Todas as suas chaves estão no dicionário
NSString
? Eu acho que eles precisam estar salvos o dicionário em uma lista de propriedades.fonte
Resposta mais simples:
NSDictionary
é apenas um objeto plist , se as chaves forem NSStrings . Portanto, guarde a "Chave" comoNSString
emstringWithFormat
.Solução:
Benefícios:
NULL
.fonte
Você já pensou em implementar o
NSCoding
Protocolo? Isso permitirá que você codifique e decodifique no iPhone com dois métodos simples que são implementados com oNSCoding
. Primeiro você precisaria adicionar oNSCoding
à sua classe.Aqui está um exemplo:
Este está no arquivo .h
Então você precisará implementar dois métodos do Protocolo NSCoding.
Confira a documentação do NSCoder para obter mais informações. Isso foi realmente útil para meus projetos, nos quais eu preciso salvar o estado do aplicativo no iPhone se o aplicativo estiver fechado e restaurá-lo ao seu estado quando ele voltar a funcionar.
A chave é adicionar o protocolo à interface e, em seguida, implementar os dois métodos que fazem parte do
NSCoding
.Eu espero que isso ajude!
fonte
Não há solução melhor. Outra opção seria salvar apenas o objeto codificado no disco - mas isso está fazendo a mesma coisa. Ambos acabam com o NSData que é decodificado quando você o quer de volta.
fonte