Parse.com让附近的用户

时间:2014-06-23 16:38:50

标签: ios parse-platform cllocationmanager pfquery

我需要使用我的应用程序获取最近15位用户的列表。当前用户的当前位置存储如下:

PFGeoPoint *currentLocation =  [PFGeoPoint geoPointWithLocation:newLocation];
PFUser *currentUser = [PFUser currentUser];
[currentUser setObject:currentLocation forKey:@"location"];
[currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
     if (!error)
     {
         NSLog(@"Saved Users Location");
     }
 }];

现在我想通过PFQuery检索附近的用户:

- (NSArray *)findUsersNearby:(CLLocation *)location
{

PFGeoPoint *currentLocation =  [PFGeoPoint geoPointWithLocation:location];
PFQuery *locationQuery = [PFQuery queryWithClassName:@"User"];

[locationQuery whereKey:@"location" nearGeoPoint:currentLocation withinKilometers:1.0];
locationQuery.limit = 15;
NSArray *nearbyUsers = [locationQuery findObjects];
return nearbyUsers;
}

不幸的是它不起作用。我的阵列似乎没有条目。有人可以为我清理一下,如何以正确的方式使用查询?

干杯,大卫

(也发布于:https://www.parse.com/questions/pfquery-to-retrieve-users-nearby

1 个答案:

答案 0 :(得分:5)

首先快速发表评论

创建地理点的代码是一个“长时间运行的进程”,当您在主线程上运行它时,您可能会看到它出现在控制台中。这意味着应用程序被阻止(冻结),直到返回地理位置。

您最好使用代码...

[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
    // Now use the geopoint
}];

findObjects查询的情况相同。你应该使用......

[locationQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    // use the objects
}];

实际答案

我想这是一个读访问问题。当您访问User表时,默认情况下,该表没有公共读取权限。

您是否在app app delegate中设置了默认的读取权限......

PFACL *defaultACL = [PFACL ACL];
[defaultACL setPublicReadAccess:YES];
[PFACL setDefaultACL:defaultACL withAccessForCurrentUser:YES];

另外,也许可以尝试放松约束。 1km是一个非常小的半径,需要检查。

啊,我刚发现的其他东西。 [PFQuery queryWithClassName:@"User"];使用了错误的类名。

应为@"_User"

但是,更好的解决方案是使用该类生成查询...

PFQuery *userQuery = [PFUser query];

当你正确地继承PFObject类时,它有这个方法可以为你生成正确的查询。