Ios 设置查询顺序

Ios 设置查询顺序,ios,parse-platform,pfquery,Ios,Parse Platform,Pfquery,我想让我的PFQuery以随机顺序出现,这样下次我使用limit创建相同的PFQuery时,它不会返回与第一个相同的对象 PFQuery *query = [PFUser query]; [query orderBy...]; //Is there a randomOrder method? //Or a workaround to get random order? [query setLimit:10]; 我需要每次都以随机顺序执行,否则每次PFQu

我想让我的
PFQuery
以随机顺序出现,这样下次我使用limit创建相同的
PFQuery
时,它不会返回与第一个相同的对象

PFQuery *query = [PFUser query];
[query orderBy...]; //Is there a randomOrder method?
                    //Or a workaround to get random order?
[query setLimit:10];

我需要每次都以随机顺序执行,否则每次
PFQuery
都将包含相同的10个对象

您不能更改查询中返回的数据的顺序,但可以使用分页来更改返回的第一个对象-因此您可以这样做(它基于Parse中的ToDo示例代码,但适用于任何对象)-

您现在可以检索10个对象。对于任何给定的跳过计数,它们的顺序都是相同的,但您可以在检索到10个项目后随机化顺序。只需将它们放入
NSMutableArray
中,并在此回答中使用技巧-

请注意,此代码不是最佳的,因为它不在后台线程上执行获取任务。要使用后台线程,您将使用以下类似的方法-

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"]);
            }
        }
    }];


}];

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;
}

PFQuery不提供随机对象。您可以获取所有对象,然后随机从中获取任意10个对象并显示它。

如果您提供更多有关原因的信息,也许我可以帮助查询每次都以相同的顺序包含相同的10个对象。我不能让这做任何事情。我只是用测试过的代码更新了我的问题它每次返回10个不同的随机对象好的,谢谢,我想我可以用这个。但是你能解释一下当你在这里设置跳过时会发生什么吗?它会跳过一个(随机数)*10个对象?不,它只是跳过随机数目的对象。
limit=10
使它在跳过
skip
行后返回下一个10行,其中skip在0和count-10之间是随机的。
- (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;
}
NSArray *randomIndices = [self generateRandomIndices:maxIndex limit:10];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"index IN %@", randomIndices];
PFQuery *query = [PFQuery queryWithClassName:@"className" predicate:predicate];