как использовать coredata для получения списка мест, упорядоченных по расстоянию - PullRequest
12 голосов
/ 01 октября 2009

У меня есть приложение iphone на основе coredata, и у меня есть объект с широтой и долготой в качестве свойств. Как я могу вернуть все мои объекты, упорядоченные по расстоянию от текущего местоположения? Ранее я делал это без coredata, написав SQL-запрос, но я новичок в coredata и не могу понять это. Я хотел бы использовать NSFetchedResultsController для прямого перехода к моему табличному виду.

Любая помощь, пожалуйста?

Ответы [ 3 ]

9 голосов
/ 03 октября 2010

По моему опыту, лучший способ сделать это - вычислить расстояние каждой отдельной записи при первой загрузке (или изменении местоположения) и сохранить это свойство в CoreData, чтобы вы могли легко извлекать записи, используя свойство distance.

Вот фрагмент кода, который вычисляет расстояние между двумя наборами координат:

for(SWShow *show in shows) {
    CLLocation *showLocation = [[CLLocation alloc] initWithLatitude:show.latitude longitude:show.longitude];
    double distance = [currentLocation distanceFromLocation:showLocation]/1000 // in km
    show.distance = @(distance);
}

[managedObjectContext save];
2 голосов
/ 17 ноября 2009

У меня похожая ситуация - и хотя вышеприведенное верно в отношении невозможности использовать NSFetchedResultsController, вы все равно можете использовать базовые данные для извлечения ваших данных.

Я также использовал sqlite3 и раньше - и моя выборка выполнялась как серия выборок с увеличением размеров ограничивающего прямоугольника - до тех пор, пока не будет достигнут размер, при котором у меня будет «достаточно» результатов. В моем случае я удваиваю широту и долготу для каждой итерации - получая ок. площадь в четыре раза за каждую итерацию.

Этот метод прекрасно работает и в Core Data - но, как указано выше, вам нужно скопировать объекты в новый массив и отсортировать их, используя собственный метод, после завершения выборки.

1 голос
/ 01 октября 2009

Ну, вот в чем проблема: когда вы выполняете NSFetchRequest, вы можете основывать предикат только на постоянных свойствах. Кажется крайне маловероятным, что у вас будет постоянное свойство, которое отслеживает расстояние от текущего местоположения.

Вы можете добавить временное свойство для вашей сущности, которое дает расстояние от некоторого глобально определенного местоположения. Вам нужно будет сделать запрос на выборку, который получит все объекты, а затем упорядочить их по этому временному свойству.

Если у вас много объектов, вы рискуете довольно быстро заполнить свою память. И даже если вы этого не сделаете, вы все равно будете тратить время на выбор объектов, которые никогда не собираетесь использовать.

Полагаю, у вас, вероятно, был отличный оператор SQL SELECT, который вычислял текущее расстояние в вашей предыдущей версии. Вы не сможете повторить это с Core Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...