Как ждать переменную в Swift перед выполнением функции? (Swift)

ниже мой код. Я хочу, чтобы значение Широта и Долгота в моей Постстроке. Но когда он делает posttring, мои значения все еще равны нулю, потому что swift еще не обновил местоположение. Итак, как я могу ждать широты и долготы, прежде чем poststring получит значения? Я слышал что-то о didset, но я не знаю, как его использовать и где я должен его использовать.

import Foundation
import CoreLocation


protocol FeedmodelProtocol: class {
func itemsDownloaded(items: NSArray)
}


class Feedmodel: NSObject, URLSessionDataDelegate, CLLocationManagerDelegate {



weak var delegate: FeedmodelProtocol!
let locationManager = CLLocationManager() // create Location Manager object
var latitude : Double?
var longitude : Double?

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location: CLLocationCoordinate2D = manager.location?.coordinate else { return }
// set the value of lat and long
latitude = location.latitude
longitude = location.longitude

}

func downloadItems() {
self.locationManager.requestAlwaysAuthorization()

// For use in foreground
// You will need to update your .plist file to request the authorization
self.locationManager.requestWhenInUseAuthorization()

if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters

locationManager.startUpdatingLocation()

}
let myUrl = URL(string: "http://example.com/stock_service4.php");
let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
var request = URLRequest(url:myUrl!)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"var postString = ""if let lat = latitude, let long = longitude {
locationManager.stopUpdatingLocation()
postString = "lati=\(Int(lat))&longi=\(Int(long))"// do task here now that postString is not empty
}
request.httpBody = postString.data(using: .utf8)
let task = defaultSession.dataTask(with: request) { data, response, error in


guard let data = data, error == nil else {                                                 // check for fundamental networking error
print("error=\(String(describing: error))")
return

}


if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
print("error=\(String(describing: error))")
}

let responseString = String(data: data, encoding: .utf8)
print("responseString = \(String(describing: responseString))")
print("error=\(String(describing: error))")
self.parseJSON(data)

}

task.resume()

}

func parseJSON(_ data:Data) {

var jsonResult = NSArray()

do{
jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray;
} catch let error as NSError {
print(error)

}

var jsonElement = NSDictionary()
let stocks = NSMutableArray()

for i in 0 ..< jsonResult.count
{
print(jsonResult)
jsonElement = jsonResult[i] as! NSDictionary


let stock = Stockmodel()

//the following insures none of the JsonElement values are nil through optional binding
if  let Datum = jsonElement["Datum"] as? String,
let Tankstelle = jsonElement["Tankstelle"] as? String,
let Kraftstoff1 = jsonElement["Kraftstoff1"] as? String,
let Preis1 = jsonElement["Preis1"] as? String,
let Kraftstoff2 = jsonElement["Kraftstoff2"] as? String,
let Preis2 = jsonElement["Preis2"] as? String,
let Notiz = jsonElement["Notiz"] as? String,
let longitude = jsonElement["longitude"] as? String,
let latitude = jsonElement["latitude"] as? String



{
print (Datum)
print(Tankstelle)
print(Kraftstoff1)
print(Preis1)
print(Kraftstoff2)
print(Preis2)
print(Notiz)
print(longitude)
print(latitude)
stock.Datum = Datum
stock.Tankstelle = Tankstelle
stock.Kraftstoff1 = Kraftstoff1
stock.Preis1 = Preis1
stock.Kraftstoff2 = Kraftstoff2
stock.Preis2 = Preis2
stock.Notiz = Notiz
stock.longitude = longitude
stock.latitude = latitude


}

stocks.add(stock)

}

DispatchQueue.main.async(execute: { () -> Void in

self.delegate.itemsDownloaded(items: stocks)

})
}
}

Благодарю вас!

2

Решение

Функция locationManager(_:didUpdateLocations:) это вызов каждый раз, когда местоположение обновляется. Так что вы должны добавить downloadItems() в диспетчере местоположений вот так:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location: CLLocationCoordinate2D = manager.location?.coordinate else { return }

// set the value of lat and long

latitude = location.latitude
longitude = location.longitude

downloadItems()
}

Смотрите документацию о locationManager (_: didUpdateLocations 🙂

4

Другие решения

Других решений пока нет …