Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I pass params on timer selector [duplicate]

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let mostRecentLocation = locations.last else {
            return
        }

        print(mostRecentLocation.coordinate.latitude)
        print(mostRecentLocation.coordinate.longitude)        
        Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(StartTestVC.sendDataToServer), userInfo: nil, repeats: true)
    }

    func sendDataToServer (latitude: Double, longitude: Double) {
        SFUserManager.shared.uploadPULocation(latitude, longitude:longitude)
    }

I want send data to server every 1 minute. I am using Timer.scheduledTimer and setting selector. But how could I send lat/lng params to my function?

like image 938
pmb Avatar asked Jul 24 '17 16:07

pmb


2 Answers

For sending the data with Timer you can use the userInfo parameter for pass the data.

Here is the sample by which you can get call of selector method and by that you can pass your location coordinate to it.

Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(iGotCall(sender:)), userInfo: ["Name": "i am iOS guy"], repeats:true)

For handling that userInfo you need to go according to below.

func iGotCall(sender: Timer) {
    print((sender.userInfo)!)
}

for your case make sure your didUpdateLocations is called frequently.

like image 132
Maulik Pandya Avatar answered Oct 08 '22 04:10

Maulik Pandya


One way to make sure your sendDataToServer is always uploading the latest coordinates without inputting the coordinates to the function as input arguments would be to store the values in a scope, which can be accessed by the function and use those values inside the function.

Assuming you make mostRecentLocation a class property, you can use below code

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let mostRecentLocation = locations.last else {
        return
    }   

    self.mostRecentLocation = mostRecentLocation
    Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(StartTestVC.sendDataToServer), userInfo: nil, repeats: true)
}

func sendDataToServer() {
    SFUserManager.shared.uploadPULocation(self.mostRecentLocation.coordinate.latitude, longitude:self.mostRecentLocation.coordinate.longitude)
}
like image 45
Dávid Pásztor Avatar answered Oct 08 '22 02:10

Dávid Pásztor