2012-04-11 63 views
3

我有一個實體Tag與字符串屬性tagName。我去取這個實體中的所有對象爲NSFetchedResultsController,但我想用tagName「Main」作爲第一個對象。下面是我現在在做什麼:核心數據結果分類到NSFetchedResultsController

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext]; 

[fetchRequest setEntity:entity]; 

NSSortDescriptor *lastDescriptor2 = 
[[[NSSortDescriptor alloc] initWithKey:@"tagName" ascending:NO comparator:^NSComparisonResult(NSString* tag1, NSString* tag2) { 
    NSLog(@"compare"); 
    if ([tag1 isEqualToString:@"main"]) return NSOrderedAscending; 
    if ([tag2 isEqualToString:@"main"]) return NSOrderedDescending; 
    return [tag1 compare:tag2]; 
}] autorelease]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor2]]; 
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
self.fetchedResultsController = theFetchedResultsController; 
self.fetchedResultsController.delegate=self; 

if (![[self fetchedResultsController] performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
} 

該代碼被稱爲在我viewDidLoad方法,並且只調用一次。第一次被調用時,出於某種原因,sortDescriptor在這裏不適用 - 它只是不被調用(NSLog語句也沒有出現)。我的結果僅基於我爲ascending指定的值BOOL返回 - 該塊將被忽略。

但是,當我插入一個新的Tag對象爲MOCNSFetchedResultsController更新委託方法被調用,實際sortDescriptor得到應用,並且NSLog(@"compare")終於出現,但只有當我進行更新的對象!無論我嘗試了什麼,我都無法適用於初始抓取。

有什麼想法嗎?

+0

Mohabitar,您是否嘗試過使用標準排序描述符而不是自定義比較器?我這樣說是因爲存在一些奇怪的未指定的規則,關於通過對商店的提取實際上可以應用什麼類型的操作。另外,我建議你將測試隔離到NSFetchRequest。結果控制器增加了噪音。 IOW,確保抓取工作。然後擔心顯示它。安卓 – adonoho 2012-04-12 14:37:30

+0

雅一切正常的排序描述符正常工作。提取正在執行。我的結果甚至是按照上面這個排序描述符的字母順序提取的,所以一切正常。我在沒有NSFetchedResultsController的正常獲取請求上試過這個確切的排序描述符,它工作得很好。它只是NSFetchedResultsController給我的問題。 – Snowman 2012-04-12 15:17:48

回答

1

正如你可能已經看到過的那樣,如果你傳入你的NSFetchRequest的謂詞是塊謂詞,那麼你的獲取請求將失敗。發生這種情況是因爲CoreData需要將您的謂詞轉換爲SQL,以便它可以針對數據庫運行它。結果是,謂詞永遠不會與獲取請求產生的對象進行實際比較。

排序描述符也是如此。執行提取時,提取請求不會執行與對象的比較。它作爲SQL的一部分傳遞。

你也描述了一個我上面描述的規則的一個有趣的例外。當你有一個現有的NSFetchedResultsController並添加一個對象到NSManagedObjectContext時,NSFetchedResultsController通過針對該對象評估NSPredicate和NSSortDescriptor來更新,而不是將它們轉換爲SQL。

相關問題