使用 NSTimer 更好地验证信标

Use NSTimer for better validation of beacon

我在 SWIFT 中有一个程序,可以检测一个或多个信标何时超出范围并基于 它会执行诸如将一些数据保存到数据库等操作。一切正常,但是我确实得到了很多 误报 "didExitRegion" 被解雇,几秒钟后 "didEnterRegion" 在我没有被移动等情况下被解雇
我知道这与信标的调整及其质量有很大关系,但此时我想出了一个替代方案。
所以我决定使用 NSTimer 来查看我是否真的超出范围,或者我得到的只是一个误报? 所以当 didExitRegion 被解雇时,我启动 NSTimer 60 秒。如果 60 秒到了并且 didEnterRegion 没有启动,那么我知道 我真的超出范围并执行我需要做的任何数据保存。 否则,如果 didEnterRegion 在 60 秒内被调用,那么我会假设它是误报并使 nstimer 什么都不做。

只要我使用一个信标,一切都很好。我对计时器的问题是当多个信标超出范围时。 假设第一个信标超出范围,所以 didExitRegion 开始着火并启动 NSTimer 假设 20 秒后第二个信标不在范围内并且 didExitRegion 再次被触发并且那个再次启动 NSTimer。 现在我的 NStimer 完全不同步,那时,事情不正常,NSTimer 在 60 秒时不断启动 起床等等

所以我的问题是这个解决方案的工作是什么?在无效之前再次调用时,如何使我的 nstimer 保持同步? 这个解决方案有更好的方法吗?同样,我知道质量更好的信标会有所帮助,但目前我不适合。

一种解决方案是保留这样的字典:

var pendingExits = Dictionary<CLBeaconRegion,NSDate>()

每次接到 didExitRegion 电话时:

  • 仅在字典为空时才启动 NSTimer -- 否则,假设计时器已经 运行.

  • 将区域连同新的 NSDate() 添加到字典中以设置添加时的时间戳。

当您收到 didEnterRegion 回调时:

  • 在字典中查找区域。如果有,请将其删除。

当计时器关闭时:

  • 查找时间戳为 60 秒或更早的任何条目。为此,从字典中删除该区域并触发您的自定义退出逻辑。

在字典中查找最新的剩余时间戳(如果有的话)。启动定时器,在那个时间加 60 秒。