Swift и Firebase сначала сортируют драйверы в массив - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь извлечь все доступные драйверы из моей базы данных Firebase, а затем, возможно, поместить их в массив, чтобы я мог рассчитать, какой драйвер ближе к пользователю.Или есть лучший способ сделать это, чем массив

Вот мой код ниже для получения драйверов, его работа и ниже это изображение для моей таблицы базы данных

ref.child("drivers").queryOrdered(byChild: "status").queryEqual(toValue: "available").observe(.childAdded) { (snapshot) in
    print(snapshot.value!)

}

ВотКод, который будет сортировать ближайший к пользователю драйвер, но мне нужно сначала отсортировать драйверы в массив

var closestLocation: CLLocation?
var smallestDistance: CLLocationDistance?

for location in locations {
  let distance = currentLocation.distanceFromLocation(location)
  if smallestDistance == nil || distance < smallestDistance {
    closestLocation = location
    smallestDistance = distance
  }
}

print("smallestDistance = \(smallestDistance)")

Database Image

1 Ответ

0 голосов
/ 29 мая 2018

Чтобы заполнить массив из Firebase, нам нужно взять каждый узел драйвера, получить интересующие нас дочерние узлы, сгруппировать их и добавить в массив.

Для этого мы собираемсявозьмите представленный снимок, сопоставьте его со словарем и затем прочитайте дочерние узлы по их ключам.Затем используйте Структуру для хранения расстояния и имени драйвера в массиве.

Имейте в виду, что использование .childAdded будет повторять все существующие узлы один раз, а затем каждый раз вызывать код в закрытииДобавлен дочерний объект - вы можете захотеть прочитать узел один раз с помощью .value и вместо этого перебрать узлы в этом снимке (т.е. .observeSingleEvent (of: .value))

Вот очень подробный код для чтения вашегодрайверы и добавьте их, а также их расстояние от нашего текущего местоположения в массив.

Обратите внимание, что Firebase является асинхронным, поэтому обработку расстояний массива следует выполнять в замыкании, и любой код, следующий за этим кодом, будет выполняться раньшеэтот код завершен.

struct DriverAndDistance {
    var driver = ""
    var distance = 0.0
}

var driverArray = [DriverAndDistance]()

func readDriversAndAddObserver() {
    let driversRef = self.ref.child("drivers")
    driversRef.observe(.childAdded, with: { snapshot in
        if snapshot.exists() == false { return }
        let dict = snapshot.value as! [String: Any]
        let firstName = dict["Firstname"] as! String
        let long = dict["long"] as! Double
        let lat = dict["lat"] as! Double
        let distanceFromHere = self.getDistance(long, lat)
        let dd = DriverAndDistance(driver: firstName, distance: distanceFromHere)
        self.driverArray.append(dd)
        //do calculations here and present data to user
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...