PFUser当前位置按最近的升序位置对数组进行排序

时间:2015-06-05 02:40:54

标签: objective-c sorting parse-platform

过去4天一直在尝试使用此代码来尝试调用PFUser位置,然后将其拉出"位置"。从收到"位置"我希望根据用户位置按照升序对照片数组进行排序。但是,用户位置未正确填充,并且最终为PFUser位置为零。

(NSArray *)caches {

  PFGeoPoint *userGeoPoint = [PFUser currentUser][@"location"];

  PFQuery *query = [Cache query];

  [query whereKey:@"location" nearGeoPoint:userGeoPoint withinMiles:20];
  query.limit = 20;

  NSMutableArray *photoArray = [[query findObjects] mutableCopy];

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

    if (!error) {

      [[PFUser currentUser] setObject:geoPoint forKey:@"currentLocation"];
      [[PFUser currentUser] saveInBackground];
    }
  }];

  return photoArray;
}

1 个答案:

答案 0 :(得分:0)

您尝试这样做的方式存在一些问题:

  1. 您正在使用findObjects()来同步获取查询结果。这将阻止主线程,直到返回结果。您应该使用findObjectsInBackgroundWithBlock()代替。
  2. 由于您使用异步方法获取位置和a 查询结果的同步方法,您的查询将始终在保存用户位置之前完成。
  3. 每次获取照片而不是使用保存的值时,您都在查询用户的位置。理想情况下,您希望事先保存用户的位置(可能在应用程序启动时),以便在您进行查询时已经设置好。您甚至可以设置计时器来每分钟或您选择的时间间隔更新用户的位置。
  4. 您正在查询“位置”列,但保存了“currentLocation”。确保使用相同的列名来设置和检索位置。
  5. 我建议这样做。启动应用程序后调用此函数以在后台更新用户的位置:

    - (void)updateUserLocation {
        [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
            if (!error) {
                [[PFUser currentUser] setObject:geoPoint forKey:@"location"];
                [[PFUser currentUser] saveInBackground];
            }
        }];
    }
    

    然后,当您需要获取照片时,请调用此功能以在后台获取照片:

    - (void)getPhotosInBackground:(void (^)(NSArray *photos, NSError *error))block {
        PFGeoPoint *userGeoPoint = [PFUser currentUser][@"location"];
    
        PFQuery *query = [Cache query];
        [query whereKey:@"location" nearGeoPoint:userGeoPoint withinMiles:20];
        [query setLimit:20];
        [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
            block(objects, error);
        }];
    }