【问题标题】:NSFetchedResultsController sections localized sortedNSFetchedResultsController 部分本地化排序
【发布时间】:2010-04-30 12:14:00
【问题描述】:

如何将 NSFetchedResultsController 与已翻译的排序键和 sectionKeyPath 一起使用?

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

使用带有排序键和“类型”上的 sectionKeyPath 的 NSFetchedResultController 我收到订单和部分 -A型 - B型 - 类型C

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

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

因为它仍然按 typeA、typeB、typeC 排序

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

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

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

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

我猜,最后我需要一个派生属性上必要的 NSSortDescriptor 的排序顺序。此排序顺序也必须用于 sectionKeyPath。

感谢任何提示。

【问题讨论】:

    标签: iphone nsfetchedresultscontroller


    【解决方案1】:

    好的,这不是一个好的解决方案,但最终它可以工作(因为我有一个定义的有限记录集 ca. 100):

    关于初始化应用程序:

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

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

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

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

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

    但这不是一个优雅的解决方案。

    【讨论】:

      【解决方案2】:

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

      对于排序,一种可能性是执行以下操作:

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

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

      不确定如何处理 sectionKeyPath。

      【讨论】:

      • 是的,我尝试了这一点。但老实说,我无法说服 NSString 使用这个类别定义的比较方法......我没想到 sectionKeyPath 会成为问题,因为我可以在这里使用应匹配本地化排序的排序顺序的瞬态属性来自排序描述符。
      • 我又试了一次。请参考答案“我再次尝试使用自定义比较...”(评论太长)。
      【解决方案3】:

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

      您可以在创建 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

      【讨论】:

      • 感谢您的回答。我试过这个,但没有看到有什么不同。这个问题不仅发生在从一种语言切换到另一种语言时,如果我停留在一种语言设置中也会发生。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2014-02-12
      • 2011-05-22
      • 2021-03-05
      • 2013-07-16
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多