ios - PFQuery接收不同的数据顺序

标签 ios parse-platform

我正在使用以下代码来检索一些数据,但问题是每次我运行应用程序时,我都会以不同的顺序接收数据:

[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {

    if (!error) {

        NSDate *currentDate = [NSDate date];

        __block PFQuery *query = [[PFQuery alloc] initWithClassName:@"orders"];

        [query setLimit:25];

        [query whereKey:@"location" nearGeoPoint:geoPoint withinKilometers:kilometers];
        [query whereKey:@"createdAt" lessThanOrEqualTo:currentDate];

        [query orderByDescending:@"createdAt"];

        [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
            if (objects.count > 0) {

                [self.flebData removeAllObjects];
                [self.flebData addObjectsFromArray:objects];

                dispatch_async(dispatch_get_main_queue(), ^{

                    [self.tableView reloadData];

                    [self.tableView.pullToRefreshView stopAnimating];
                    // once refresh, allow the infinite scroll again
                    self.tableView.showsInfiniteScrolling = YES;

                });
            }
            query = nil;
        }];
    }
}];

这是错误还是我的代码有问题?

最佳答案

根据PFQuery docs ,大多数位置限制,特别是 whereKey:nearGeoPoint:whereKey:nearGeoPoint:withinMiles:whereKey:nearGeoPoint:withinKilometers: whereKey:nearGeoPoint:withinRadians:,强制查询返回结果“按距引用点的距离(从最近到最远)排序”;因此,如果您的位置发生变化,结果顺序也会发生变化。

但是位置约束whereKey:withinGeoBoxFromSouthwest:toNortheast:不会对结果强制执行任何距离排序算法。因此,正如 Paulw11 在他的评论中链接到的答案所指出的那样,您可以将该方法与 [query orderByDescending:@"createdAt"]; 一起使用以获得您想要的结果顺序。

不过,您的潜在问题是 whereKey:withinGeoBoxFromSouthwest:toNortheast: 方法在正方形内检查,whereKey:nearGeoPoint:withinKilometers: 在圆内检查半径,它们通常是不同的方法。

因此,如果在该圆千米半径内找到点并且将结果按创建顺序排序对您很重要,也许您应该对您的结果进行排序通过查询找到它们之后,例如:

PFQuery *query = [[PFQuery alloc] initWithClassName:@"orders"];

[query setLimit:25];

[query whereKey:@"location" nearGeoPoint:geoPoint withinKilometers:kilometers];
[query whereKey:@"createdAt" lessThanOrEqualTo:currentDate];

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    if (objects.count > 0) {

        createdAtDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO];
        sortDescriptor = [NSArray arrayWithObject:createdAtDescriptor];
        self.flebData = [objects sortedArrayUsingDescriptors:sortDescriptor];

关于ios - PFQuery接收不同的数据顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515412/

相关文章:

ios - 使用 Swift 3 恢复应用内购买

ios - 强制 subview Controller 调用基本 View Controller 方法

arrays - 根据数组检索某些 PFObject

node.js - Express 应用程序 - 托管在 Heroku 上并使用 Parse 作为后端

node.js - 如何将解析服务器挂载 url 更改为主根 url "/"

swift - AVPlayer 无法正常工作 - Swift

ios - Autolayouts 设置纵向和横向 View iOS

c# - iOS 版本 Xamarin 应用程序兼容性

ios - 使用代码和 Collection View 进行 segue

ios - 如何获得关系的另一面