2016-04-21 2 views
0

Я пытаюсь восстановить все объекты животных на основе определенных параметров. Сначала мне нужно получить их местоположение от синтаксического анализа, а также от имени, но поскольку я импортирую более одного и используя геокодер, я использую строки, а не массив. Поэтому вместо добавления импортируемой информации в массив я мутирую переменную. Что бы я ни случилось, так это запрос, который будет проходить через первый объект, а затем запустить метод 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. 
       } 
      } 

     }) 

} 
+0

является 'retrieveLocation()' асинхронным или синхронным? Я предполагаю, что он асинхронный, что означает, что функция достигает цикла for, продолжается через условное связывание и при вызове 'retrieveLocation() метод немедленно возвращается к вызывающему, который затем снова возвращается через цикл for, перед 'retrieveLocation()' фактически извлекает нужное местоположение. возможно, сделайте 'retrieveLocation()' синхронным или просто добавьте все ваши адреса в свой массив и перейдете через массив, что, вероятно, является лучшим вариантом. – MikeG

+0

Да, это асинхронно, как сделать его синхронным? – user6032625

+0

Вы можете прочитать в центральную центральную отправку, чтобы начать. Вы можете отправить в синхронную очередь, вызвав 'dispatch_sync (...)' в одной из предопределенных глобальных очередей. Не гарантируйте, что это решит вашу проблему. Почему вы не хотите добавлять адреса в массив? – MikeG

ответ

0

Это должно работать, если вы используете локальную переменную и передать эту локальную переменную в реализации retirveLocation, которая принимает строку в качестве параметра retrieveLocation(address: String)

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{ 

     let newAddress = address 
     print("sdfadsf \(self.addr)") 

     } 
     } 
    if let name = object["Name"] as? String{ 
    self.impname = name 
    print("rturrty \(self.impname)") 
    self.retrieveLocation(newAdress) 
    } 
    } 
} 
} 

func retrieveLocation(address: String){ 
    let geocoder = CLGeocoder() 

    geocoder.geocodeAddressString(address, 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. 
      } 
     } 

    }) 

} 

Проблема, кажется, что к тому времени self.addr используется в методе geocodeAddresString, цикл for завершен и, таким образом, перезаписал все предыдущие значения, которые были в одной точке индивидуально сохранены self.addr. Используя локальную переменную, она обязательно будет использовать уникальное значение для geocodeAddressString каждый раз, когда она выполнена.

+0

Это решение сработало для вас @ user6032625? – MikeG

Смежные вопросы