首页 > 解决方案 > regionDidChange 中的计时器不会快速触发 4

问题描述

我有一个 mapView,我想在其中启用或关闭连续位置跟踪。如果它打开,我希望它在地图上有用户交互时暂时暂停,并在用户交互在短时间后结束后恢复。我正在尝试在regionWillChangeand中执行此操作,并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 { }因为我认为线程可能是问题,但这也不起作用。

标签: iosswifttimermapkit

解决方案


您实例化了一个计时器,但从未将其添加到任何带有add(_:forMode:). 实际上,您从未启动过计时器。

或者,更简单的是,您可以使用scheduledTimer.


推荐阅读