2010-04-30 58 views
7

我如何使用帶翻譯的排序鍵和sectionKeyPath的NSFetchedResultsController?NSFetchedResultsController部分本地排序

問題:在類型爲typeA,typeB,typeC等數據庫中的屬性「type」中有ID,而不是直接因爲它應該本地化的值。在英語中,typeA = Bird,typeB = Cat,typeC =德語中的Dog,它將是Vogel,Katze,Hund。

與排序鍵和sectionKeyPath在「類型」一NSFetchedResultController我收到的順序和部分 - 的typeA - TYPEB - typeC

接下來我翻譯顯示,一切都很好英文: - 伯德 - 貓 - 狗

現在我切換到德國和接收錯誤的排序順序 - 沃格爾 - Katze - 洪特

因爲它仍然按類型A排序,typeB,typeC

所以我正在尋找一種方法來爲NSFetchedResultsController進行本地化排序。

我嘗試了瞬態屬性方法,但這對於排序鍵不起作用,因爲排序鍵需要在實體中。

我沒有其他的想法。但我不能相信這是不可能的NSFetchedResultsController本地化所需的派生屬性?

有像Using custom sections with NSFetchedResultsController?這樣的相關討論,但區別在於自定義節名稱和排序鍵可能具有相同的順序。不在我的情況下,這是主要區別。

最後我會需要一個排序順序爲必要的NSSortDescriptor派生屬性,我猜。此排序順序也可用於sectionKeyPath。

感謝您的任何提示。

回答

3

OK,不是一個很好的解決方案,但在最後它的工作(因爲我有一個定義的有限組記錄長約100):

在intializing應用:

  • 我創建管理對象中的「order by」屬性。
    • 我檢查自上次以來本地化(以及它的排序順序)是否發生了變化。如果是這樣的話:
    • 我獲取所有記錄並按照本地化名稱排列在NSArray中。
    • 我在店裏

對於性能比較的原因,我只取並根據NSPredicate記錄進行排序寫回的記錄。

比我可以使用所有現有的代碼使用「排序」作爲排序鍵和節鍵路徑。

我知道我可以使用我的有序數組作爲表視圖的數據源,但我想保留現有代碼並使用NSFetchedResultsController的方法。

爲了方便起見,我完全控制了排序,將來會適合我的需求,因爲我計劃構建更復雜的排序順序(基於位置,更高的頂部記錄使用概率等) )

然而,這不是一個優雅的解決方案。

0

最後我會需要一個排序順序爲派生屬性上必要的NSSortDescriptor,我猜。

對於分揀,一個可能性是做這樣的事情:

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

其中translatedCompare是你寫的比較之前本地化值的比較方法(作爲的NSString類別)。

不知道如何處理sectionKeyPath。

+0

是的,我試過這個到某個點。但說實話,我無法說服NSString使用這種類別定義的比較方法.... 我沒有想到sectionKeyPath是一個問題,因爲我可以使用瞬態屬性這裏應該匹配的排序順序從排序描述符進行本地化排序。 – Gerd 2010-04-30 14:22:18

+0

我給了它另一個嘗試。請參考答案「我再次嘗試使用自定義比較...」(太長的評論)。 – Gerd 2010-05-02 18:35:41

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

+0

感謝您的回答。我試過這個,但沒有看到有什麼區別。這個問題不僅發生在從一種語言切換到另一種語言時發生,如果我停留在一種語言環境中,也會發生問題。 – Gerd 2010-04-30 15:35:13