Gestão Dev & TIARTIGO

Lendo e escrevendo plists em Objective-C

plists são ótimas para armazenar pequenas quantidades de dados semiestruturados quando você não quer gastar muito ao usar um banco de dados completo. O OS X, como sem dúvida você deve ter notado, usa plists extensivamente para armazenar dados de configuração.

Eu gosto de usar plists para criar aplicações guiadas por configuração. Na App Store, você pode encontrar TRIBE e The Green Book. Essas duas aplicações parecem ser muito diferentes, mas elas usam exatamente o mesmo código base. A diferença está em alguns arquivos de configuração plist. Nossos clientes estão muito felizes com isso, porque eles estão ocupados produzindo vários títulos diferentes para a App Store usando esse método.

Para ler o arquivo plist no pacote da aplicação, você apenas precisa de algumas linhas de código e lidar com certos erros. Gosto de colocar esse código em um método bastante conveniente como este:

    - (id)readPlist:(NSString *)fileName {  
NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;

NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];
plistData = [NSData dataWithContentsOfFile:localizedPath];

plist = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
if (!plist) {
NSLog(@"Error reading plist from file '%s', error = '%s'", [localizedPath UTF8String], [error UTF8String]);
[error release];
}

return plist;
}

Não sou muito fã de usar id como valores de retorno ou parâmetros para métodos. Prefiro checagens mais fortes, então eu normalmente envolvo o método readPlist em dois métodos que retornam ou um array ou um dicionário.

    - (NSArray *)getArray:(NSString *)fileName {  
return (NSArray *)[self readPlist:fileName];
}

- (NSDictionary *)getDictionary:(NSString *)fileName {
return (NSDictionary *)[self readPlist:fileName];
}

Escrever um arquivo plist não é muito mais difícil:

- (void)writePlist:(id)plist fileName:(NSString *)fileName {  
NSData *xmlData;
NSString *error;

NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];
xmlData = [NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
if (xmlData) {
[xmlData writeToFile:localizedPath atomically:YES];
} else {
NSLog(@"Error writing plist to file '%s', error = '%s'", [localizedPath UTF8String], [error UTF8String]);
[error release];
}
}

Note que escrever um arquivo dentro do bundle do aplicativo não é bom se você quiser que seus dados sejam mantidos depois que a aplicação for atualizada, uma vez que o pacote será substituído. Você pode olhar nos códigos de exemplo do SQLite que a Apple disponibiliza para saber como copiar arquivos para fora do bundle do aplicativo antes de usá-los.

 ?

Texto original disponível em http://iphoneincubator.com/blog/data-management/reading-and-writing-plists

Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram/Threads @portalimasters

Ver perfil