ios - regionDidChange 中的计时器不会快速触发 4
问题描述
我有一个 mapView,我想在其中启用或关闭连续位置跟踪。如果它打开,我希望它在地图上有用户交互时暂时暂停,并在用户交互在短时间后结束后恢复。我正在尝试在regionWillChange
and中执行此操作,并regionDidChange
检查该区域是否通过用户操作进行了更改。暂停工作得很好,但是当需要恢复计时器时,似乎永远不会完成。
func pauseTrack() {
locationManager.stopUpdatingLocation()
self.trackingMode = false
self.shouldTrack = true
}
@objc func resumeTrack() {
locationManager.startUpdatingLocation()
self.trackingMode = true
self.shouldTrack = false
}
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
let didMapTouchesBegin = mapTouchBegan()
if (didMapTouchesBegin == true && self.trackingMode == true) {
self.pauseTrack()
if (self.resumeTimer != nil) {
self.resumeTimer.invalidate()
}
self.countdownTime = 5.0
}
}
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
let didMapTouchesEnd = mapTouchEnded()
if (didMapTouchesEnd == true && self.shouldTrack == true) {
print("tracking will resume")
self.resumeTimer = Timer(timeInterval: self.countdownTime, target: self, selector: #selector(self.resumeTrack), userInfo: nil, repeats: false)
}
}
func mapTouchBegan() -> Bool {
let view = self.mapView.subviews[0]
if let gestureRecognizers = view.gestureRecognizers {
for recognizer in gestureRecognizers {
if (recognizer.state == UIGestureRecognizerState.began) {
print("user started touching screen")
return true
}
}
}
return false
}
func mapTouchEnded() -> Bool {
let view = self.mapView.subviews[0]
if let gestureRecognizers = view.gestureRecognizers {
for recognizer in gestureRecognizers {
if (recognizer.state == UIGestureRecognizerState.ended) {
print("user finished touching screen")
return true
}
}
}
return false
}
控制台的print("tracking will resume")
输出与预期一致,其他控制台日志记录已确认输入的跟踪按预期工作,但由于某种原因计时器无法正常工作。我已经确认它在创建后不是 nil ,并且我也尝试在内部创建它,Dispatch.main.async { }
因为我认为线程可能是问题,但这也不起作用。
解决方案
您实例化了一个计时器,但从未将其添加到任何带有add(_:forMode:)
. 实际上,您从未启动过计时器。
或者,更简单的是,您可以使用scheduledTimer
.
推荐阅读
- javascript - 使用复选框向数组添加多个项目 - redux react
- flutter - 如何使用一个 StatefulWidget 显示来自多个 HTTP 页面的数据
- python - 使用参数化测试或单独测试的测试工作流程
- reactjs - TypeError:无法读取未定义的属性“formatAMPM”
- cmake - 如何使用 cmake 处理 Yocto 配方中的符号链接?
- python - Python。如何从字典中复制一个值并将该值放入另一个列表中的键
- javascript - 基于laravel jquery javascript中的组合选择自动填充文本字段
- aws-iot - 物联网消息跨区域发布/订阅(不同区域的端点)
- java - Spring/REST 没有找到杰克逊 json 转换器
- coffeescript - 如何在 WDIO Testrunner + Mocha 中连接两个编译器 CoffeeScript 和 Babel?