2016-05-02 4 views
0

У меня есть программа в SWIFT, которая обнаруживает, что маяк или несколько маяков находятся за пределами допустимого диапазона и на основе , что он будет выполнять что-то вроде сохранения некоторых данных в базе данных и т. Д. Все работает хорошо , однако я получаю много ложным положительным способом, который срабатывает «didExitRegion», и несколько секунд спустя «didEnterRegion» срабатывает, пока я не был перемещен и т. д.
Я знаю, что это имеет много общего с настройкой маяков и их качеств, но в это время я придумал альтернативное решение.
Итак, я решил использовать NSTimer, чтобы узнать, действительно ли я вне диапазона, или это просто ложный позитив, который я получаю? поэтому, когда у вас срабатывает ExitRegion, я начинаю NSTimer в течение 60 секунд. Если 60 секунд вверх и didEnterRegion не загорелся, тогда я знаю . Я действительно вне диапазона и выполняю любую экономию данных, которую мне нужно делать. В противном случае, если didEnterRegion вызывается в течение 60 секунд, я предполагаю, что он был ложным и недействителен для nstimer и ничего не делает.Используйте NSTimer для лучшей проверки маяка

Все работает хорошо, пока я работаю с одним маяком. Проблема с таймером заключается в том, что несколько маяков выходят за пределы допустимого диапазона. позволяет сказать, что первый маяк выходит за пределы диапазона, поэтому didExitRegion загорается и запускает NSTimer . Пусть говорят, что спустя 20 секунд второй маяк выключен, и снова didExitRegion запускается, и снова запускается NSTimer. Теперь мой NSTimer это все рассинхронизировалась и в то время, вещи не работают правильно и NSTimer непрерывно начинают себя, когда 60 секунд вверх и т.д.

Так что мой вопрос, что работа вокруг этого решения? Как я могу сохранить синхронизацию моего nstimer, когда он вызывается снова, прежде чем он будет аннулирован? Есть ли лучший способ для этого решения? Опять же, я знаю, что маяки лучшего качества могут помочь, но это не вариант для меня в это время.

ответ

1

Одним из решений является сохранение словаря, как это:

var pendingExits = Dictionary<CLBeaconRegion,NSDate>()

Каждый раз, когда вы получаете didExitRegion вызов:

  • начать только в NSTimer если словарь пуст - в противном случае , предположим, что таймер уже запущен.

  • Добавьте регион в словарь вместе с новым NSDate(), чтобы установить отметку времени, когда она была добавлена.

Когда вы получаете didEnterRegion обратного вызова:

  • Поищите области в словаре. Если он есть, удалите его.

Когда таймер гаснет:

  • Посмотрите на любую запись с отметкой времени 60 секунд или более старый. Для этого удалите область из словаря и запустите свою пользовательскую логику выхода.

Найти последнюю оставшуюся временную метку (если есть) в словаре.Начните таймер, чтобы выйти в это время плюс 60 секунд.

Смежные вопросы