我做了一些与 Shortseller 类似的事情,但没有使用类别。
InternationalBook
and 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:
and 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
自定义访问器根据幕后用户的区域设置返回适当的值。