Parse.com привлекайте пользователей поблизости

#ios #parse-platform #cllocationmanager #pfquery

#iOS #синтаксический анализ-платформа #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:

Сначала краткий комментарий

Код для создания географической точки — это «длительный процесс», вы, вероятно, увидите, что он появляется в консоли, когда вы запускаете его в основном потоке. Это означает, что приложение заблокировано (заморожено) до тех пор, пока не будет возвращена географическая точка.

Вам было бы лучше использовать код…

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

Это то же самое для findObjects запроса. Вы должны использовать…

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

Фактический ответ

Я полагаю, что это проблема с доступом на чтение. Поскольку вы обращаетесь к таблице пользователей, которая по умолчанию не имеет общедоступного доступа для чтения.

Устанавливаете ли вы доступ для чтения по умолчанию в делегате приложения примерно так…

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

Кроме того, возможно, попробуйте ослабить ограничения. 1 км — это очень маленький радиус для проверки.

А, еще кое-что, что я только что заметил. [PFQuery queryWithClassName:@"User"]; использует неправильное имя класса.

Так и должно быть @"_User" .

Однако лучшим решением было бы использовать класс для генерации запроса…

 PFQuery *userQuery = [PFUser query];
 

Когда вы PFObject правильно подклассируете класс, у него есть этот метод, который сгенерирует для вас правильный запрос.