Основные данные: объект с минимальной разницей между свойством и переменной

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

select t.lat
      ,t.lon
      ,(t.lat-varLat) + (t.lon - varLon) diff
from table t
order by diff ASC.

заданные varLat и varLon - это координаты местоположения, к которому я хочу ближайшую запись. Однако я понятия не имею, как это сделать в Core Data с помощью NSPredicate.

Худшее, что я могу себе представить, - это цикл fetchrequests с предикатом, который расширяет «диапазон поиска» вокруг заданного (varLat, varLon), и использование longitude BETWEEN %@ && latitude BETWEEN %@ с двумя массивами (каждый из которых имеет центр + и центральный радиус в качестве членов массива) в качестве параметров, каждый время расширять этот диапазон, пока я не получу хит ... однако это далеко не оптимально.

Спасибо за ваш совет.


person Pega88    schedule 22.11.2013    source источник


Ответы (1)


Во-первых, ваш запрос неверен с ошибкой до app. 40%. Ваш расчет просто суммирует разницу в широте и долготе. Фактическая разница, если предположить 2D-поверхность, составляет sqrt((lat-varlat)^2 + (lon-varLon)^2). На реальной поверхности геометрия более сложная, но в большинстве случаев разница незначительна.

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

person Mundi    schedule 22.11.2013
comment
Спасибо. Не обратил там внимание на геометрический аспект, вы правы. В этом случае я просто зациклю свои объекты. Спасибо. - person Pega88; 22.11.2013
comment
как я мог забыть того старого друга Пифагора :-). Спасибо, что указали на это. - person Pega88; 22.11.2013