#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
правильно подклассируете класс, у него есть этот метод, который сгенерирует для вас правильный запрос.