2013-07-22 40 views
2

我正在研究基於Xcode CoreData示例的項目。我有一個名爲Entity與存儲的實體被更新的時間戳updated密鑰的實體類和NSFetchResultsController設置降序排列與它進行排序:NSFetchedResultsController按錯誤順序排序

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:_managedObjectContext]]; 
[fetchRequest setFetchBatchSize:20]; 
[fetchRequest setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]]]; 

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

這在正常工作最初的負載,但是當我插入一個應該插入到其他對象之間的NSManagedObject時,它會插入到頂部。當我重新啓動應用程序時,它會插入到正確的位置。

例如:最初的表看起來像:

updated: 300 
updated: 200 
updated: 100 

,當我插入ManagedObject:updated: 250,我想到表的樣子:

updated: 300 
updated: 250 <-- inserted here 
updated: 200 
updated: 100 

,但是這是我得到的:

updated: 250 <-- inserted at the top 
updated: 300 
updated: 200 
updated: 100 

這是NSFetchResultsController是如何工作的,或者是有什麼辦法可以重新排序每個插入的所有NSManagedObjects?謝謝:)

+0

當你插入一個新的對象,你怎麼取? –

+0

委託方法' - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller' ...當NSManagedObjectContext被保存時被調用。 –

回答

2

我自己的答案

NSManagedObject有它的方法isUpdated,所以有一個鍵名updated實體無效。

方法你不能覆蓋

NSManagedObject本身定製NSObject中的許多功能,使 管理對象可適當集成到核心數據 基礎設施。核心數據依賴於NSManagedObject的實現下面的方法 ,你因此,絕對不得 覆蓋:primitiveValueForKey :, setPrimitiveValue:forKey :, :,的isEqual哈希 ,父類,類,自我,isProxy,isKindOfClass :, isMemberOfClass :, conformsToProtocol :, respondsToSelector:, managedObjectContext,實體的objectID,isInserted,isUpdated,請將isDeleted ...

http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

+0

非常感謝!幾個月來一直試圖找出這個問題! –

0

你也可以使用一個NSArray您的委託方法

-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSArrary *resultsArray = [controller allObjects]; 
    // sort 
NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray; 
sortedArray = [reultsArray sortedArrayUsingDescriptors:sortDescriptors]; 
    // reload table using this array 
} 
+0

謝謝。我不能讓NSSearchResultsController自動對每個插入的結果進行排序嗎? –

1

在默認排序,一個新的對象總是被插入到頂部。如果您想自定義排序,您應該保留每個對象的索引。然後你可以用任何方式對你的對象進行排序。

+0

我明白了,謝謝。 –