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