Я пытаюсь восстановить все объекты животных на основе определенных параметров. Сначала мне нужно получить их местоположение от синтаксического анализа, а также от имени, но поскольку я импортирую более одного и используя геокодер, я использую строки, а не массив. Поэтому вместо добавления импортируемой информации в массив я мутирую переменную. Что бы я ни случилось, так это запрос, который будет проходить через первый объект, а затем запустить метод retrieveLocation, а затем перейти к следующему объекту, импортированному из синтаксического анализа, но вместо этого он импортирует все, а затем запускает метод, поэтому в итоге я получаю только 1 объект сколько из них предполагается импортировать.Почему метод запускается в конце?
let query = PFQuery(className: "Animals")
query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) in
if(error == nil){
for object in objects!{
if let addressobj = object["Add"] as? NSDictionary{
if let address = addressobj["address"] as? String{
self.addr = address
print("sdfadsf \(self.addr)")
}
}
if let name = object["Name"] as? String{
self.impname = name
print("rturrty \(self.impname)")
self.retrieveLocation()
}
}
}
}
func retrieveLocation(){
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(addr, completionHandler: {(placemarks, error) -> Void in
if((error) != nil){
print("Error", error)
}
if let placemark = placemarks?.first {
let coordinates = PFGeoPoint(location: placemark.location)
if(whatever is true){
append the name and address into an array. This is the part where I just get repeats of the LATEST imported object.
}
}
})
}
является 'retrieveLocation()' асинхронным или синхронным? Я предполагаю, что он асинхронный, что означает, что функция достигает цикла for, продолжается через условное связывание и при вызове 'retrieveLocation() метод немедленно возвращается к вызывающему, который затем снова возвращается через цикл for, перед 'retrieveLocation()' фактически извлекает нужное местоположение. возможно, сделайте 'retrieveLocation()' синхронным или просто добавьте все ваши адреса в свой массив и перейдете через массив, что, вероятно, является лучшим вариантом. – MikeG
Да, это асинхронно, как сделать его синхронным? – user6032625
Вы можете прочитать в центральную центральную отправку, чтобы начать. Вы можете отправить в синхронную очередь, вызвав 'dispatch_sync (...)' в одной из предопределенных глобальных очередей. Не гарантируйте, что это решит вашу проблему. Почему вы не хотите добавлять адреса в массив? – MikeG