2010-01-14 34 views
3

我正在使用NSFetchRequest来获取一些项目,这些项目可以按热门或随机排序。如何使用CoreData随机排序

遵循指南,我可以使用NSSortDescriptor轻松地按照流行度对项目进行排序。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"popularity" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 

但是,如何随机排序呢?

回答

5

是否有这样的事,作为一个“随机排序”?

如果你想随机通过置换获得NSFetchedResultsController结果显示,记住,你是基于一个indexPath引用元素在你的控制器读取的结果(-objectAtIndexPath:)填充你的表视图。

因此,你可以做的一件事就是改变索引路径的NSMutableArray(或数组),编写一个将索引路径映射到置换索引路径的方法。该方法将索引路径作为输入,查找数组(或数组)并将新索引路径作为输出。您使用这个新的索引路径来填充您的表格视图。

或者,您可以将randomizerTag属性添加到您的Item实体。您可以使用任何置换函数来生成整数排列{ 1 ... n },并将这些编号保存到商店中的每条记录。一旦保存,您可以重新提取,应用排序描述符,对您的记录的值进行排序。

+0

哈哈“随机排序”听起来矛盾。但是,是的,我想要的是一种随机的。 建议1听起来像是一种方法。但是,在将索引路径映射到fetchedResults时,我确实遇到了来自tableview的奇怪行为。无论如何,我会尝试。 建议2是一个窍门。我会尽量不要碰我的实体属性。但如果一切都失败了,我会试试这个。 – samwize 2010-01-14 14:14:28

2

我认为你需要创建一个随机属性的对象然后排序。

+0

任何有关如何创建随机财产的指南? 这不是用随机数字创建一个int属性,对吧? – samwize 2010-01-14 09:39:39

+0

我认为你随机int属性会做得很好... – 2010-01-14 09:59:54

2

你可以获取你的对象,把它们放在一个NSMutableArray,并且将它洗,因为这里讨论:

What's the Best Way to Shuffle an NSMutableArray?

+0

我使用NSFetchedResultsController iPhone的表,所以我不认为我应该得到fetchedObjects和排序它 – samwize 2010-01-14 09:37:45