NSFetchedResultsController部分已本地化排序

时间:2010-04-30 12:14:01

标签: iphone nsfetchedresultscontroller

我如何使用带有翻译排序键和sectionKeyPath的NSFetchedResultsController?

问题:我在数据库中的属性“type”中有ID,如typeA,typeB,typeC,...而不是直接值,因为它应该被本地化。在英语中,typeA = Bird,typeB = Cat,typeC = Dog in German,它将是Vogel,Katze,Hund。

使用带有排序键的NSFetchedResultController和“type”上的sectionKeyPath,我收到订单和部分 - typeA - typeB - typeC

接下来我翻译显示,一切都很好用英文: - 鸟 - 猫 - 狗

现在我切换到德语并收到错误的排序顺序 - 沃格尔 - Katze - Hund

因为它仍按类型A,类型B,类型C

排序

所以我正在寻找一种方法来本地化NSFetchedResultsController的排序。

我尝试了瞬态属性方法,但这对排序键不起作用,因为排序键需要在实体中。

我没有其他想法。但我不相信在本地化所需的派生属性上使用NSFetchedResultsController是不可能的?

有像Using custom sections with NSFetchedResultsController?这样的相关讨论,但区别在于自定义部分名称和排序键可能具有相同的顺序。不是我的情况,这是主要的区别。

最后,我想在派生属性上需要一个必要的NSSortDescriptor排序顺序。此排序顺序还可用于sectionKeyPath。

感谢任何提示。

3 个答案:

答案 0 :(得分:3)

好的,不是一个很好的解决方案,但最终它正在工作(因为我有一个有限的记录集,大约100):

初始化应用程序:

  • 我在托管对象中创建了“order by”属性。
    • 我检查自上次以来本地化(以及排序顺序)是否发生了变化。如果是这样的话:
    • 我获取所有记录并通过本地化名称在NSArray中对其进行排序。
    • 我在商店里写回记录

出于性能原因,我只根据NSPredicate获取和排序记录。

我可以使用“order by”作为排序键和部分键路径来使用所有现有代码。

我知道我可以使用我的有序数组作为表视图的数据源,但我想保留现有代码并使用NSFetchedResultsController的方法。

为方便起见,我完全控制了排序,因为我计划构建更复杂的排序顺序(基于位置,在顶部使用更高的记录概率等),这将满足我未来的需求。 )

然而,这不是一个优雅的解决方案。

答案 1 :(得分:0)

  

最后,我想在派生属性上需要一个必要的NSSortDescriptor排序顺序,我想。

对于排序,一种可能性是做:

[NSSortDescriptor initWithKey:@"type" 
 ascending:YES 
 selector:@selector(translatedCompare:)]

其中translatedCompare是您编写的比较方法(作为NSString上的类别),在比较它们之前对值进行本地化。

不确定如何处理sectionKeyPath。

答案 2 :(得分:0)

我猜这个问题是由缓存引起的。

使用以下方法创建NSFetchedResultsController对象时,可以使用给定名称设置缓存。最后一个变量是缓存名称。

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name

如果存在具有相同名称的缓存,则NSFetchedResultsController使用缓存来计算节和排序。缓存写在磁盘(而不是内存)上。

因此,如果您更改英语和德语之间的语言,则应删除缓存。要删除缓存,您可以使用类方法deleteCacheWithName:

您可以在此处找到详细信息。 http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24