У меня есть следующий 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)
}})}
}
Im, используя этот метод .observe для размещения маркеров на карте. Если я использую .childRemoved, он не покажет аннотации на карте. Из того, что вы говорите, мне понадобятся 2 метода: 1. поместите маркеры на карту 2. слушайте удаленные маркеры? исправьте меня, если я ошибаюсь? ... –
Нет. Верно. Я объяснял все возможные комбинации, которые вы можете использовать ... Просто проверьте мой ответ. Примите и оцените это как ответ, если он решает вашу проблему :) Happy Coding – Dravidian
@DavidLintin: вам действительно понадобится обратный вызов для каждого события, которое вы хотите ответить к. Так что в вашем случае это скорее '.childAdded' (который у вас уже есть),' .childChanged' и '.childRemoved' (которые вам нужно будет добавить). –