Загружать дополнительные объекты из Core Data, когда пользователь прокручивает MKMapView - PullRequest
0 голосов
/ 20 августа 2009

С MapKit в iPhone 3.0 SDK вы создаете объекты, которые соответствуют протоколу MKAnnotation. Загрузка их в MKMapView очень проста. Однако когда пользователь прокручивает MKMapView, пора загружать новые аннотации. Вероятное место для запроса новых объектов будет в mapView: regionDidChangeAnimated: , которое вызывается при изменении региона карты, а затем добавляет / заменяет аннотации новыми.

В частности, я бы хотел запросить базовые данные, чтобы получить все объекты, которые существуют в текущем MKCoordinateRegion (mapView.region), так что я загружаю только те объекты, которые будут показаны на экране , У объектов в Базовых данных есть атрибуты широты и долготы (и атрибут CLLocation определен в классе '.m / .h, который я могу заполнить вручную из этого) и использую его для NSP-предиката для поиска близлежащих объектов.

Из-за того, сколько объектов существует в базе данных Core Data, мы не можем предварительно загрузить ВСЕ объекты в качестве аннотаций, иначе у нас не хватит памяти (и это будет мучительно медленно).

Как получить только те объекты, которые имеют местоположения в текущих границах карты?

1 Ответ

5 голосов
/ 20 августа 2009

Извините, английский не мой родной язык.

Как только пользователь прокрутит вниз или вверх .. значения региона будут изменены, в частности, значения latitudeDelta и longitudeDelta из regionDidChangeAnimated . Оттуда вы можете получить границы вашего текущего mapView .. (minlat, minlong, maxlat, maxlong)

minlat = current_coordinate_lat - latitudeDelta; //note everything is in dd (decimal degrees)

maxlat = current_coordinate_lat + latitudeDelta;

minlong = ...

maxlong = ...

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

Смотрите изображение здесь .. http://img43.imageshack.us/img43/703/picture1txe.png

Оттуда .. я могу сделать заявление sqlite3 sql, чтобы получить точки в этих пределах ..

SELECT * FROM pois WHERE categ_id = %@ AND (sat_latitude > %f AND sat_latitude < %f) AND (sat_longitude > %f AND sat_longitude < %f)

...