2017-06-11 3 views
0

非同期呼び出しを待って、結果のアドレスをMKMapViewの目印に入力するのに問題があります。ジオコーディングされたアドレスに基づいてMapViewを更新すると、多数の場所の1つのピンだけが表示されます

地図の表示に1つの目印しか表示されないという問題があります。私はそれをデバッグして配列内に見たので他のものが存在することを知っています。マップビューを完全に埋めるのではなく、MKAnnotationが割り当てられているだけです。

// Load user sales 
    myFirebaseController.loadSales(){(result: [SaleModel]) in 
     // Assign result 
     self.salesList = result 

     let geocoder = CLGeocoder() 

     let myGroup = DispatchGroup() 

     // For each sale loaded in 
     for sale in self.salesList{ 
      myGroup.enter() 

      // Decode the address into coordinates 
      geocoder.geocodeAddressString(sale.saleAddress!, completionHandler: {(placemarks, error) -> Void in 
       if((error) != nil){ 
        print("Error", error!) 
       } 

       if let placemark = placemarks?.first { 
        // Set the coordinate 
        let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate 

        // Add the annotation 
        self.createMapAnnotation(coordinate: coordinates, title: sale.saleTitle!, address: sale.saleAddress!) 
       } 

       myGroup.leave() 
      }) 
     } 

     myGroup.notify(queue: .main){ 
      for annotation in self.mapView.annotations { 
       self.mapView.removeAnnotation(annotation) 

       self.mapView.addAnnotation(annotation) 
      } 
     } 
    } 

ディスパッチグループが残っている一度あなたが見ることができるように、私はこれが悪いの試みだと思いますけれども、私は、それをリフレッシュするための手段として、すべての注釈を削除し、それらを再追加しようと、明らかにそれはdoesnの地図ビューを変更する(self.salesListの最初のsale注釈のみを記録する)

私はここで間違っていますか?

注:self.createMapAnnotation()は、マップビューに注釈を追加します。

編集:私はこの次試してみました - Wait until swift for loop with asynchronous network requests finishes executingをしかし、私の状況を支援していないようだ

答えて

0

myGroup.notifyのループが完了した後にコードの下に書いて試してみてください(キュー:.main)メソッド。

self.mapView?.showAnnotations((self.mapView?.annotations)!, animated: true) 
+0

うん、うまくいかないようです。問題は 'myGroup.notify(queue:.main)'は各ジオコードスレッドではなく1回だけ呼び出されるということです – ChewySalmon

関連する問題