2016-10-09 2 views
2

У меня есть следующий Firebase структуру базы данных:Отображение и обновление аннотаций через Firebase Swift

{ 
    "Users" : { 
    "TzDyIOXukcVYFr8HEBC5Y9KeOyJ2" : { 
     "Contact Number" : "", 
     "Name" : "", 
     "User Email" : "[email protected]" 
    }, 
    "xqKdv6hN1wSGplvKh3sYuutFmwz2" : { 
     "Contact Number" : "", 
     "Name" : "", 
     "User Email" : “[email protected]” 
    } 
    }, 
    "buildings-list" : { 
    "-KTd0ZU-pJHYBs282RfI" : { 
     "addedByUser" : "TzDyIOXukcVYFr8HEBC5Y9KeOyJ2", 
     "content" : "Post 1", 
     "cost" : "5000", 
     "duration" : "Annually", 
     "latitude" : "25.2003331668539", 
     "longitude" : "55.2563433525882", 
     "number" : "1234567890", 
     "timestamp" : "Sun 09 Oct" 
    } 
    } 
} 

У меня есть ссылка .Принимать к базе данных Firebase, который добавляет маркеры на карте на основе широты и долготы.

func displayAllMarkers() { 

     dbRef.observe(.childAdded, with: { snapshot in 

      let latitude = (snapshot.value as AnyObject!)!["latitude"] as! String! 
      let latitudeDouble = Double(latitude!) 
      let longitude = (snapshot.value as AnyObject!)!["longitude"] as! String! 
      let longitudeDouble = Double(longitude!) 
      let markerTitle = (snapshot.value as AnyObject!)!["content"] as! String! 
      let durationTitle = (snapshot.value as AnyObject!)!["duration"] as! String! 
      let costTitle = (snapshot.value as AnyObject!)!["cost"] as! String! 
      let timestamp = (snapshot.value as AnyObject!)!["timestamp"] as! String! 
      self.telephoneNumber = (snapshot.value as AnyObject!)!["number"] as! String! 

      let annotation = myAnnotationView(title: markerTitle!.capitalized, coordinate: CLLocationCoordinate2D(latitude: latitudeDouble!, longitude: longitudeDouble!), duration: durationTitle!, cost: costTitle!, info: "", timestamp: timestamp!, contactNumber: self.telephoneNumber!) 
      //my annotationView is my custom class for annotations. 
      self.mapView.addAnnotation(annotation as MKAnnotation) 


      })} 

Это успешно добавляет маркеры на карте, однако, когда ребенок удаляется маркеры не обновляя/удаляются с карты. Нужно ли добавлять цикл for? ... любая помощь оценивается.

UPDATE: Я свернул код с помощью существующей структуры.

func getMarkers() { 

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

     for buildings in snapshot.children { 

      let buildingsObject = Buildings (snapshot: buildings as! FIRDataSnapshot) 
      print(buildingsObject) 

      let latDouble = Double(buildingsObject.latitude!) 
      let lonDouble = Double(buildingsObject.longitude!) 

      let annotation = myAnnotationView.init(title: buildingsObject.content, coordinate: CLLocationCoordinate2D.init(latitude: latDouble!, longitude: lonDouble!), duration: buildingsObject.duration, cost: buildingsObject.cost, info: "", timestamp: buildingsObject.timestamp, contactNumber: buildingsObject.number) 

      print(snapshot) 

      self.mapView.addAnnotation(annotation as MKAnnotation) 

     }})} 

}

ответ

0

CMD + CLICK на .childAdded, и вы будете перенаправлены на FIRDataEventType документации класса.

case childAdded // 0, fired when a new child node is added to a location 

case childRemoved // 1, fired when a child node is removed from a location 

case childChanged // 2, fired when a child node at a location changes 

case childMoved // 3, fired when a child node moves relative to the other child nodes at a location 

case value // 4, fired when any data changes at a location and, recursively, any children 

Ваши варианты: -

  • Так что, если вы хотите, чтобы прослушать место для если ребенок будет удален ваш типСобытия должен быть .childRemoved

  • Но если вы хотите чтобы избежать загрузки другой нити для .childRemoved (что может увеличить потребление памяти вашего приложения) просто используйте .value вместо любого из них для eventType. Но весь снимок будет загружен, поэтому не забудьте пропустить все привязки, а затем добавить аннотацию.

  • Использование .value увеличит пропускной способности канала потребление, которое ограничено. Таким образом, лучшим подходом было бы создание структуры и добавление аннотации к массиву этой структуры типов. И покажите свою аннотацию из этого массива. Всякий раз, когда аннотирование добавляется или удаляется, делайте то же самое с вашим массивом и вашей базой данных firebase соответствующим образом.

+0

Im, используя этот метод .observe для размещения маркеров на карте. Если я использую .childRemoved, он не покажет аннотации на карте. Из того, что вы говорите, мне понадобятся 2 метода: 1. поместите маркеры на карту 2. слушайте удаленные маркеры? исправьте меня, если я ошибаюсь? ... –

+0

Нет. Верно. Я объяснял все возможные комбинации, которые вы можете использовать ... Просто проверьте мой ответ. Примите и оцените это как ответ, если он решает вашу проблему :) Happy Coding – Dravidian

+0

@DavidLintin: вам действительно понадобится обратный вызов для каждого события, которое вы хотите ответить к. Так что в вашем случае это скорее '.childAdded' (который у вас уже есть),' .childChanged' и '.childRemoved' (которые вам нужно будет добавить). –