Search code examples
iosswiftfirebasemapkitmkmapview

How to add multiply annotation in mapVIew


I have mapView and address from firebase. Now i can add in mapView only one annotation, but in print("Address (self.allAddresses)") i got three address:

Address Москва, Пресненская набережная д.8, квартира 195, подъезд 94

Address Москва, ул. Правды д.24 строение 3

Address Москва,ул.Электрозаводская д.21

How i can add three or more annotations?

My firebase:

{
  «Address» : {
    «AddressOne» : {
      "address" : "Москва, Пресненская набережная д.8, квартира 195, подъезд 94",
    },
    "AddressTwo» : {
      "address" : "Москва, ул. Правды д.24 строение 3",
    },
    "AddressThree» : {
      "address" : "Москва,ул.Электрозаводская д.21",
    }
  }
}

And my code:

class AddressesMapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var allAddresses: String = ""

    var count = 0

    let geocoder = CLGeocoder()

    var addressRef: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()

        addressRef = Database.database().reference(withPath: "Address")

        loadAddressFromFirebase()

    }
    func loadAddressFromFirebase() {

        addressRef.observe(.value, with: { (snapshot) in

            for address in snapshot.children.allObjects as! [DataSnapshot] {

                let value = address.value as! NSDictionary

                self.allAddresses = value["address"] as? String ?? ""

                print("Address \(self.allAddresses)")

                if self.count < self.allAddresses.count {

                    let addresses = self.allAddresses

                    self.geocoder.geocodeAddressString(addresses, completionHandler: { (placemarks, error) in

                        print("Address - \(addresses)")

                        guard error == nil else { return }

                        guard let placemarks = placemarks else { return }

                        if let placemark = placemarks.first {

                            self.mapView.addAnnotation(MKPlacemark(placemark: placemark))

                        }

                        self.count += 1
                        print("Count - \(self.count)")
                    })
                }   
            }  
        }) 
    }
}

Solution

    • Try allocating geoCoder wihtin the 'for' loop.
    • Call geocoder.cancelGeocode() method.

              let geocoder = CLGeocoder()
              geocoder.geocodeAddressString(addresses, completionHandler: { (placemarks, error) in
      
                  print("Address - \(addresses)")
      
                  guard error == nil else { return }
      
                  guard let placemarks = placemarks else { return }
      
                  if let placemark = placemarks.first {
      
                      self.mapView.addAnnotation(MKPlacemark(placemark: placemark))
      
                  }
      
                  self.count += 1
                  print("Count - \(self.count)")
                  geocoder.cancelGeocode()
              })