как ускорить получение данных из Firebase Firestore? - PullRequest
0 голосов
/ 11 мая 2018

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

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

ссылка:

import Foundation
import FirebaseFirestore
import Firebase

enum FirestoreCollectionReference {
    case users
    case events
    case cities

    private var path : String {
        switch self {
        case .users : return "users"
        case .events : return "events"
        case .cities : return "cities"
        }
    }

    func reference () -> CollectionReference {
        return Firestore.firestore().collection(path)
    }
}

Я использую метод getAllCitiesDataFromFirestore в классе CityKM, чтобы получить данные о городе, хранящиеся в пожарном хранилище

class CityKM {
    var name : String
    var coordinate : GeoPoint

    init (name: String , coordinate: GeoPoint ) {
        self.name = name
        self.coordinate = coordinate
    }

    init (dictionary: [String:Any]) {
        // this init will be used if we get data from firebase observation to construct an event object

        name = dictionary["name"] as! String
        coordinate = dictionary["coordinate"] as! GeoPoint
    }

    static func getAllCitiesDataFromFirestore (completion: @escaping ( [CityKM]? )->Void) {
        // to retrieve all cities data from Firebase database by one read only, not using realtime fetching listener

        let startTime = CFAbsoluteTimeGetCurrent() // to track time consumption of this method

        FirestoreCollectionReference.cities.reference().getDocuments { (snapshot, error) in
            if let error = error {
                print("Failed to retrieve all cities data: \(error.localizedDescription)")
            } else {
                print("Sucessfully get all cities data from firestore")

                guard let documentsSnapshot = snapshot, !documentsSnapshot.isEmpty else {
                    completion(nil)
                    return
                }

                let citiesDocuments = documentsSnapshot.documents
                var cityArray = [CityKM]()

                for document in citiesDocuments {
                    guard let cityName = document.data()["name"] as? String,
                          let cityCoordinate = document.data()["coordinate"] as? GeoPoint else {return}

                    let theCity = CityKM(name: cityName, coordinate: cityCoordinate)
                    cityArray.append(theCity)
                }

                completion(cityArray)

                let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime // to track time consumption of this method
                print("Time needed to get all cities data from Firestore : \(timeElapsed) s.") // to track time consumption of this method

            }
        }
    }


}



extension CityKM {

    // MARK: - User Helper Methods
    func toDictionary() -> [String:Any]{
        return [
            "name" : name,
            "coordinate" : coordinate
        ]
    }


}

из моей области отладки, напечатано

«Время, необходимое для получения данных всех городов из магазина пожаров: 1,8787678903 с.»

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

Не думаю, что скорость интернета - это проблема, так как я могу открывать видео на YouTube без буферизации

1 Ответ

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

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

Когда вы вызываете getDocuments, клиент Firebase должен проверить на сервере, какое значение документа , прежде чем может вызвать ваш код, который затем отображает значение для пользователя.Как уже было сказано: в вашем коде нет способа ускорить это чтение, поэтому пользователю понадобится не менее 1,8 с, чтобы увидеть документ.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...