Таймер в регионе DidChange не будет срабатывать swift 4 - PullRequest
0 голосов
/ 26 мая 2018

У меня есть mapView, в котором я хочу включить или отключить постоянное отслеживание местоположения.Если он включен, я хочу, чтобы он временно приостанавливался, когда на карте было взаимодействие с пользователем, и возобновлялся после того, как взаимодействие с пользователем закончилось через короткий промежуток времени.Я пытаюсь сделать это в regionWillChange и 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") выводит на консоль, как и ожидалось, и другие записи в консоли имеютподтвердил, что отслеживание входов работает как задумано, но по какой-то причине таймер просто не работает.Я подтвердил, что это не ноль после его создания, и я также попытался создать его внутри Dispatch.main.async { }, потому что я думал, что многопоточность может быть проблемой, но это тоже не сработало.

1 Ответ

0 голосов
/ 26 мая 2018

Вы создали экземпляр таймера, но никогда не добавляли его в цикл выполнения с add(_:forMode:).По сути, вы никогда не запускали таймер.

В качестве альтернативы и проще, вы можете как создать экземпляр, так и запустить таймер, используя scheduledTimer.

...