我想让我的PFQuery以随机顺序出现,所以下次我创建相同的PFQuery时,它不会像第一个对象一样返回相同的对象。
PFQuery *query = [PFUser query];
[query orderBy...]; //Is there a randomOrder method?
//Or a workaround to get random order?
[query setLimit:10];我每次都需要随机排序,否则每次PFQuery都会包含相同的10个对象。
发布于 2014-08-14 23:48:51
您不能更改查询中返回的数据的顺序,但您可以使用分页来更改返回的第一个对象--因此您可以这样做(它基于来自Parse的ToDo示例代码,但对任何对象都有效)-
PFQuery *query =[PFQuery queryWithClassName:@"Todo"];
NSInteger count=[query countObjects];
NSInteger skip = arc4random_uniform(count-10);
query.skip=skip;
query.limit=10;
NSArray *results=[query findObjects];
NSLog(@"object count=%d",results.count);
for (PFObject *object in results) {
NSLog(@"text=%@",object[@"text"]);
}现在您可以检索您的10个对象。对于任何给定的跳过计数,它们都将是相同的顺序,但您可以在检索这10项之后随机选择顺序。简单地将它们放入一个NSMutableArray中,并在这个答案- Re-arrange NSArray/MSMutableArray in random order中使用技术
注意,这段代码不是最优的,因为它没有在后台线程上执行提取任务。若要使用后台线程,请使用以下内容-
PFQuery *query =[PFQuery queryWithClassName:@"Todo"];
[query countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
query.skip=arc4random_uniform(number-10);;
query.limit=10;
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error) {
NSLog(@"An error occurred - %@",error.localizedDescription);
}
else {
NSLog(@"object count=%d",objects.count);
for (PFObject *object in objects) {
NSLog(@"text=%@",object[@"text"]);
}
}
}];
}];发布于 2014-08-20 09:15:49
PFQuery不支持随机顺序,但可以通过为每个对象创建一个递增的索引字段来解决这一问题。
然后,如果您知道表中的maxIndex,就可以生成随机索引如下:
- (NSArray *)generateRandomIndices:(int)maxIndex limit:(int)limit {
NSMutableArray *indices = [[NSMutableArray alloc] initWithCapacity:limit];
for (int i=0; i<limit; i++) {
int randomIndex = arc4random() % maxIndex;
[indices addObject:[NSNumber numberWithInt:randomIndex]];
}
return indices;
}现在您可以使用IN谓词查询类了。
NSArray *randomIndices = [self generateRandomIndices:maxIndex limit:10];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"index IN %@", randomIndices];
PFQuery *query = [PFQuery queryWithClassName:@"className" predicate:predicate];发布于 2014-08-23 10:44:19
PFQuery不给随机对象。您可以获得所有对象,然后随机化,从其中获取任意10个对象并显示出来。
https://stackoverflow.com/questions/25318895
复制相似问题