Подтвердить что ты не робот

Как использовать coredata для получения списка мест, упорядоченных расстоянием

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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];

Ответ 3

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

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

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

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