Сортировка геопространственных элементов с использованием coredata на iOS. Самый быстрый способ обновить все атрибуты «расстояния»

#iphone #ios #core-data #geolocation #core-location

#iPhone #iOS #core-data #геолокация #ядро-местоположение

Вопрос:

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

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

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

Некоторые решения:

  1. Я мог бы ограничить количество элементов, которые я храню в core data. В целом не должно быть более 100 или около того соответствующих элементов.
  2. Я мог бы ограничить количество раз, когда пересчет выполняется, только пересчитывая, когда местоположение пользователя изменяется на некоторое значительное расстояние.
  3. Я мог бы выполнить все пересчеты в фоновом режиме.

Хотя эти решения, вероятно, должны работать, я полагаю, что должно быть более элегантное решение.

Кто-нибудь решал похожую проблему с этим?

Ответ №1:

Как вы, наверное, знаете, вы можете настроить CLLocationManager с помощью distanceFilter и desiredAccuracy. Это касается пункта 2.

100 элементов вообще не будут нагружать основные данные, если только они не являются гигантскими элементами.

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

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

Попробуйте и посмотрите, какие проблемы с производительностью у вас возникают, если таковые имеются.