Я сделал что-то похожее на Shortseller, но без использования категорий.

InternationalBook и LocalizedBook являются настраиваемыми управляемыми объектами с отношением «один ко многим» (одна международная книга ко многим локализованным книгам).
В реализации InternationalBook я добавил специальный аксессуар для 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] - это метод класса, который возвращает язык и код страны пользователя: en_US, fr_FR и т. Д. Подробнее см. Документацию на NSLocale.
См. Раздел «Пользовательские атрибуты и методы доступа к однозначным отношениям» Руководства по программированию основных данных для объяснения willAccessValueForKey: и didAccessValueForKey:.
При заполнении данных я беру строку, представляющую текущий языковой стандарт пользователя ([DataManager localeString]), и сохраняю ее вместе с локализованным названием книги в новом объекте LocalizedBook. Каждый экземпляр LocalizedBook добавляется к NSMutableSet, который представляет отношение «один ко многим».
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"];
Поскольку локализованные заголовки хранятся в управляемом объекте LocalizedBook, вы можете сделать атрибут title временным, но если вы это сделаете, вы не сможете использовать title в предикате.
Хорошая вещь в этом подходе заключается в том, что реализация отношения ко многим прозрачна для любых потребителей. Вы просто запрашиваете internationalBook.title, и настраиваемый метод доступа возвращает соответствующее значение, зависящее от языкового стандарта пользователя.
person
Gordon Hughes
schedule
22.04.2010