使用 NSTimer 更好地验证信标

Posted

技术标签:

【中文标题】使用 NSTimer 更好地验证信标【英文标题】:Use NSTimer for better validation of beacon 【发布时间】:2016-05-02 21:05:49 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

var pendingExits = Dictionary<CLBeaconRegion,NSDate>()

每次收到didExitRegion 电话时:

仅当字典为空时才启动NSTimer -- 否则,假定计时器已在运行。

将区域与新的NSDate() 一起添加到字典中以设置添加时的时间戳

当您收到didEnterRegion 回调时:

在字典中查找该地区。如果存在,请将其删除。

当计时器响起时:

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

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

【讨论】:

以上是关于使用 NSTimer 更好地验证信标的主要内容,如果未能解决你的问题,请参考以下文章

iOS 倒计时NSTimer

使用 NSTimer 的秒表错误地在显示中包含暂停时间

nstimer注意事项

如何用另一个 NSTimer 停止 NSTimer?

NSTimer 几秒钟后停止

自欺欺人的使用 NSTimer 销毁