2016-04-21 3 views
0

私は特定のパラメータに基づいてすべての動物オブジェクトを回復しようとしています。最初に、構文解析と名前からその場所を取得する必要がありますが、複数をインポートしてジオコーダーを使用しているため、配列ではなく文字列を使用しています。インポートされた情報を配列に追加するのではなく、変数を変更しています。私は何が起こるかは、クエリが最初のオブジェクトを通過し、次にretrieveLocationメソッドを実行し、次に解析された次のオブジェクトに進みますが、代わりにすべてがインポートされてメソッドが実行されるため、輸入されなければならない人の数。メソッドが最後に実行されるのはなぜですか?

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-loopに達し、条件付きバインドを継続し、 'retrieveLocation()'を呼び出すと、メソッドは呼び出し元に直ちに戻り、forループを再度繰り返します。 'retrieveLocation()'が実際に目的の場所を取得する前に。おそらく 'retrieveLocation()'を同期させるか、単純にすべてのアドレスを配列に追加し、おそらく最適なオプションである配列を反復処理します。 – MikeG

+0

はい、それは非同期です。どのように同期させるのですか? – user6032625

+0

グランドセントラルディスパッチを読み込んで開始することができます。あらかじめ定義されたグローバルキューの1つで 'dispatch_sync(...) 'を呼び出すことで、同期キューにディスパッチできます。これがあなたの問題を解決することを保証するものではありません。なぜアドレスを配列に追加したくないのですか? – MikeG

答えて

0

これは、ローカル変数を使用する場合は動作し、PARAMTER 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. 
      } 
     } 

    }) 

} 

問題としての文字列を受け取りretirveLocationの実装にこのローカル変数を渡す必要があると思われるその時self.addrによってgeocodeAddresStringメソッドで使用されている場合、forループは終了し、したがって、個別に1つのポイントにあった以前のすべての値を個別にself.addrに上書きします。ローカル変数を使用すると、実行されるたびにgeocodeAddressStringに一意の値を使用することが確実になります

+0

このソリューションはあなたのために働いていました@ user6032625? – MikeG

関連する問題