【问题标题】:Set PFQuery order设置 PFQuery 顺序
【发布时间】:2014-08-14 22:59:33
【问题描述】:

我想让我的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 个对象

【问题讨论】:

    标签: ios parse-platform pfquery


    【解决方案1】:

    您无法更改查询中返回的数据的顺序,但您可以使用分页来更改返回的第一个对象 - 因此您可以执行类似的操作(它基于 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"]);
                }
            }
        }];
    
    
    }];
    

    【讨论】:

    • 如果您提供更多信息说明原因,也许我可以提供帮助
    • 查询总是包含相同的 10 个对象,以相同的顺序,每次。我不能让它做任何事情..
    • 我刚刚用我测试过的确切代码更新了我的问题,它每次返回 10 个不同的随机对象
    • 好的,谢谢,我想我可以用这个。但是你能解释一下当你在这里设置跳过时会发生什么吗?它会跳过(随机数)*10 个对象吗?
    • 不,它只是跳过随机数量的对象。 limit=10 使其在跳过 skip 行后返回接下来的 10 行,其中跳过在 0 和 count-10 之间是随机的。
    【解决方案2】:

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

    现在您可以使用INpredicate 查询您的班级

    NSArray *randomIndices = [self generateRandomIndices:maxIndex limit:10];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"index IN %@", randomIndices];
    PFQuery *query = [PFQuery queryWithClassName:@"className" predicate:predicate];
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多