2012-02-04 39 views
1

我有一個表視圖是由分段開關排序。我想通過NSNumericSearch對錶格進行排序,以便得到1,2,11,22而不是1,11,2,22。我正在使用核心數據。fetchedresultscontroller行爲

如果我創建了多個記錄'color'屬性保持不變(即所有'紅色'),同時改變長度,最初排序的長度是正確的(1,2,11,22)。如果我切換到分段控件的另一個selectedSegmentIndex,例如'形狀'或'長度',我會在相同的數據上得到錯誤的排序順序(1,11,2,22)。

我以爲fetchedResultsController應該重新計算數據,並調用tableView來重新載入數據。

我沒有使用謂詞。我已經嘗試將緩存名稱設置爲零,但不起作用。我也嘗試過deleteCacheWithName:雖然它可能需要位於不同的位置。

一些代碼:

- (NSFetchedResultsController *)fetchedResultsController{  
if (__fetchedResultsController != nil) { 
    return __fetchedResultsController; 
} 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// Set the batch size to a suitable number. 
[fetchRequest setFetchBatchSize:20]; 

switch (segmentedControl.selectedSegmentIndex) { 
    case 0: 
     sortKey = @"color"; 
     break; 
    case 1: 
     sortKey = @"length"; 
     break; 
    case 2: 
     sortKey = @"smell"; 
     break; 
    case 3: 
     sortKey = @"shape"; 
     break; 
    default: 
     sortKey = @"color"; 
     break; 
} 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; 
NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor,sortDescriptor2, nil]; 

[fetchRequest setSortDescriptors:sortDescriptors]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:sortKey cacheName:@"Master"]; 

aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

NSError *error = nil; 
if (![self.fetchedResultsController performFetch:&error]) { 
    abort(); 
} 
return __fetchedResultsController; 
} 
- (IBAction)changeSegment:(id)sender { 
switch (segmentedControl.selectedSegmentIndex) { 
    case 0: 
     sortKey = @"color"; 
     break; 
    case 1: 
     sortKey = @"length"; 
     break; 
    case 2: 
     sortKey = @"smell"; 
     break; 
    case 3: 
     sortKey = @"shape"; 
     break; 
    default: 
     sortKey = @"one"; 
     break; 
} 
self.fetchedResultsController = nil; 
[self.tableView reloadData]; 
//[NSFetchedResultsController deleteCacheWithName:@"Master"]; 
} 

誰能幫助我在第一次正確的,第二次不正確排序的這種行爲?

回答

2

從NSFetchedResultsController文檔:

修改獲取請求 你不能簡單地改變讀取請求修改結果。如果要更改提取請求,則必須執行以下操作: 如果使用緩存,請將其刪除(使用deleteCacheWithName :)。 通常,如果您要更改提取請求,則不應使用緩存。 更改提取請求。 Invoke performFetch:

我看不到你在做什麼。更改排序順序等同於更改提取請求。

我也認爲你有它後面關於什麼是與結果控制器自動化。它會在模型​​更改時自動更新您的表格(如果您實施委託方法)而不是相反。您可能依賴於您的屬性重新加載提取的結果控制器,當它從數據源方法訪問時,我不認爲這是一個好主意。

此外,如果您期望FRC從頭開始重建,那麼對分段控制操作方法的切換語句無關緊要。我建議有一個單獨的方法返回您的獲取請求,該請求從您的FRC設置和分段控制操作方法中調用,然後按照文檔中所述切換請求。

相關問題