He hecho algo similar a Shortseller, pero sin el uso de categorías.
alt text http://i40.tinypic.com/x3ryp.png
InternationalBook
y LocalizedBook
son ambos objetos gestionados a medida con una relación uno-a-muchos (un libro internacional para muchos libros localizados).
En la implementación de InternationalBook
, he añadido un descriptor de acceso personalizado para title
:
- (NSString *)title {
[self willAccessValueForKey:@"title"];
NSString *locTitle = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"locale==%@", [DataManager localeString]];
NSSet *localizedSet = [self.localizedBook filteredSetUsingPredicate:predicate];
if ([localizedSet count] > 0) {
locTitle = [[localizedSet valueForKey:@"localizedTitle"] anyObject];
}
[self didAccessValueForKey:@"title"];
return locTitle;
}
[DataManager localeString]
es un método de clase que devuelve el lenguaje y el código del país del usuario: en_US
, fr_FR
, etc. Consulte la documentación de NSLocale
para más detalles.
Consulte la sección "Métodos del atributo personalizado y métodos de acceso a la relación uno a uno" de la Guía de programación de datos básicos para obtener una explicación de willAccessValueForKey:
y didAccessValueForKey:
.
Al rellenar los datos, tomo una cadena que representa la configuración regional actual del usuario ([DataManager localeString]
) y la guardo junto con el título del libro localizado en un nuevo objeto LocalizedBook
. Cada instancia de LocalizedBook
se agrega a NSMutableSet
, que representa la relación de uno a muchos.
NSMutableSet *bookLocalizations = [internationalBook mutableSetValueForKey:@"localizedBook"]; // internationalBook is an instance of InternationalBook
// set the values for locale and localizedTitle
LocalizedBook *localizedBook = (LocalizedBook *)[NSEntityDescription insertnNewObjectEntityForName:@"LocalizedBook" inManagedObjectContext:self.bookMOC];
localizedBook.locale = [DataManager localeString];
localizedBook.localizedTitle = theLocalizedTitle; // assume theLocalizedTitle has been defined.
[bookLocalizations addObject:localizedBook];
[bookLocalizations setValue:localizedBook forKey:@"localizedBook"];
Desde los títulos localizados están siendo almacenados en el objeto LocalizedBook
administrado, puede hacer que la atribuyen title
un transitorio, pero si lo que no se puede utilizar title
en un predicado.
Lo bueno de este enfoque es que la implementación de la relación de muchos es transparente para cualquier consumidor. Simplemente solicite internationalBook.title
y el acceso personalizado o devuelve el valor apropiado según la configuración regional del usuario detrás de las escenas.
Dios o ¿bien? :) –