2014-05-15 43 views
0

我需要從隨機順序的數據庫中獲取對象。 首先,我生成隨機的「ID」 S成NSArray並將它們設置爲斷言:(核心數據)如何爲NSFetchedResultsController進行隨機排序?

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(self.id IN %@)", randomIds]; 
// The example of randomIds contents (always different): 
// <__NSArrayM 0xd1cc4e0> (185,51,69,25,33,135,136,97,157,112,145,132,56,15,159,70,88,6,72,82) 

但是到了這個時候我的成績依然排序,因爲NSFetchedResultsController堅持設置「sortDescriptors」,其FetchRequest

NSSortDescriptor *sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES]; 
fetchRequest.sortDescriptors = @[sortingDescriptor]; 
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 

但我需要以隨機順序讀取結果:同在「randomIds」陣列。

我還沒有找到任何合理的解決方案,這個問題呢。你會如何解決它?有人有機會得到任何解決方案嗎?

回答

0

我想建議創建一個使用比較塊的NSSortDescriptor,並有該塊使用隨機數生成器來決定哪些項目先行每次比較。

但是,我有一個模糊的內存,當內部數據庫是SQLite時,不能使用基於比較器的排序描述符在對核心數據的提取請求中使用。

你爲什麼不只是你的讀取的結果數組轉換成一個可變的數組,然後搶他們:

- (NSMutableArray *) scrambledArray: (NSArray *) theArray 
{ 
    NSMutableArray *result = [theArray mutableCopy]; 
    NSUInteger count = [result count]; 
    for (NSUInteger index = 0; index < count; index++) 
    { 
    NSUInteger random = arc4random_uniform(count); 
    id itemAtIndex = result[index]; 
    result[index] = result[random]; 
    result[random] = result; 
    } 
    return result; 
} 

上面的代碼是非常快的,以O(n)的時間來完成。

+0

已經嘗試過比較塊 - 是的,它禁止與核心數據一起使用,很遺憾。當然,我可以輕鬆地將結果數組的元素轉換爲另一個數組,但我在UITableView的'cellForRowAtIndexPath'中使用了NSFetchedResultsController對象(我真的需要這樣做) – AlG

0

如果您從不需要排序描述符,只需從提取的結果控制器中將其刪除即可。

如果你用相同的獲取結果控制器需要它只是有時,你必須對其進行重新初始化。只要保持一個標誌,並重新加載獲取的結果控制器。

if (!useRandom) { 
    fetchRequest.sortDescriptor = ...; 
} 
else { 
    // add the predicate 
} 

要重新加載沒有這種描述,只是這樣做:

useRandom = YES; 
self.fetchedResultsController = nil; 
[self.tableView reload Data]; 
相關問題