私は特定のパラメータに基づいてすべての動物オブジェクトを回復しようとしています。最初に、構文解析と名前からその場所を取得する必要がありますが、複数をインポートしてジオコーダーを使用しているため、配列ではなく文字列を使用しています。インポートされた情報を配列に追加するのではなく、変数を変更しています。私は何が起こるかは、クエリが最初のオブジェクトを通過し、次に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.
}
}
})
}
は非同期または同期の 'retrieveLocation()'ですか?私の推測は、それが非同期であることです。つまり、関数がfor-loopに達し、条件付きバインドを継続し、 'retrieveLocation()'を呼び出すと、メソッドは呼び出し元に直ちに戻り、forループを再度繰り返します。 'retrieveLocation()'が実際に目的の場所を取得する前に。おそらく 'retrieveLocation()'を同期させるか、単純にすべてのアドレスを配列に追加し、おそらく最適なオプションである配列を反復処理します。 – MikeG
はい、それは非同期です。どのように同期させるのですか? – user6032625
グランドセントラルディスパッチを読み込んで開始することができます。あらかじめ定義されたグローバルキューの1つで 'dispatch_sync(...) 'を呼び出すことで、同期キューにディスパッチできます。これがあなたの問題を解決することを保証するものではありません。なぜアドレスを配列に追加したくないのですか? – MikeG