1

我正在为 iOS 开发本地化架构。我有不同的实体可以具有翻译字段,因此我为每个实体创建一个翻译实体。两个实体之间始终存在一对多的关系,允许我在未来添加新的语言,并且我可以通过Entity.translations访问翻译。到目前为止,一切都很好。

Entity
EntityTranslation

1)首先,我想知道这样的方法是否听起来不错。是我将在纯 SQL 环境中使用的解决方案,所以我想我可以遵循这条路径。

2)然后...我只想用于Entity.text为用户显示适当的文本(通过NSLocale preferredLanguages)。作为translations返回的NSSet一个选项将是手动将属性添加到实体模型,并更改 getter:

// Entity.h
@property (nonatomic, retain) NSString * text;

// Entity.m
@synthesize text;

- (NSString *) text
{
  NSString *locale = [[NSLocale preferredLanguages] objectAtIndex:0];

  NSSet *filteredTranslations = [self.translations filteredSetUsingPredicate: [NSPredicate predicateWithFormat:@"locale = %@", locale]];
  EntityTranslation *translation = [[filteredTranslations allObjects] objectAtIndex:0];

  return translation.text;
}

它有效,但它有意义吗?我会遇到性能问题吗?是否可以使用Fetched 属性做类似的事情?有些东西告诉我这应该是可能的,但我无法使用 Xcode Core Data 编辑器让它工作......

谢谢。

4

1 回答 1

2

您是否会遇到性能问题取决于您的数据库有多大以及您获取值的频率。您应该通过 Instruments 运行您的代码,以检查它花费了多少 CPU 时间,并根据需要缓存内容。

我要做的一个调整是将 NSPredicate 对象存储在静态变量中,因为它不会经常更改。

如果表中没有太多记录,最好一次获取整个记录集,然后将其保存到 NDDictionary,您可以随时查找。

但是,我认为您使用大型复杂系统(具有面向对象包装器的关系数据库)来解决一个非常简单的问题(键值查找)是错误的。复杂的解决方案几乎总是比简单的解决方案更慢且更占用内存。

推荐的本地化方法是使用 .strings 文件,我想不出使用核心数据有什么好处。您有 200MB 的本地化文本吗?如果不是,那么我认为最好使用 .strings 文件而不是核心数据。

于 2011-11-28T19:55:45.063 回答