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