Быстрая Проблема с памятью прослушивателя Google Cloud Firestore / Сбой приложения

# #swift #xcode #google-cloud-firestore

Вопрос:

Я работаю в XCode, используя составные запросы и прослушиватели Firestore для запроса коллекции Firestore с ~20 000 документами. У меня заканчивается память, и приложение выходит из строя. При меньших объемах эти запросы выполнялись нормально (например,

Я вызываю прослушиватель из отдельного класса и сохраняю ссылку на прослушиватель для вызова .remove() позже (когда мне больше не нужно будет прослушивать обновления). В ускользающем закрытии я возвращаю массив прослушиваемых объектов.

Это пример объекта, который я запрашиваю (он маленький/плоский):

 struct SomeObject: Codable, Identifiable, Hashable {
    var id: String
    var field_one: String
    var field_two: String
    var field_three: String?
    var field_four: Bool = true
}
 

Это код запроса:

  func listenForSomeObjects(_ completion: @escaping ([SomeObject]?, Error?) -> Void) -> ListenerRegistration? {
    let listener = db.collection("some_objects")
        .addSnapshotListener {(snapshot, err) in
            if let err = err {return completion(nil, err)}
            guard let snapshot = snapshot  else {return completion(nil, nil)}
            let objects: [SomeObject]? = snapshot.documents.compactMap{document in
                do {
                    return try document.data(as: SomeObject.self)
                }
                catch {
                    completion(nil, error)
                }
                return nil
            }
            return completion(objects, nil)
    }
    return listener
}
 

Это код вызова:

 let listener = firebase.listenForSomeObjects() {objects, err in
        if err != nil {return store.dispatch(AlertActions.showError(err))}
        guard let objects = objects else {return}
        store.dispatch(SomeObjectActions.setObjects(objects))
}
store.dispatch(SomeObjectActions.setListener(listener))
 

Я заметил, что если я удалю прослушиватель сразу после извлечения данных, использование памяти снизится с ~2 ГБ до ~100 МБ, но мне нужно, чтобы прослушиватель оставался в живых дольше. Мне нужно выяснить, почему используется так много памяти, пока слушатель активен, чтобы я мог поддерживать его, но я не уверен, как отлаживать дальше.

Комментарии:

1. Вообще говоря, ожидается высокое использование памяти, если прослушиватель создается для большого количества объектов. Всегда рекомендуется использовать эту функцию для управляемого объема данных. Несколько вещей, которые следует учитывать, — это то, как часто слушатель получает обновления, сколько времени требуется для увеличения памяти.

2. @AkshanshaSinghal Я закончил тем, что еще больше уменьшил размер интересующего объекта и наложил ограничение в 10 тысяч на слушателя. Когда мне нужно получить больше данных, я удаляю прослушиватель и делаю несколько последовательных запросов getDocuments разумного размера, чтобы получить нужные мне данные… Спасибо за обратную связь

Ответ №1:

Вообще говоря, ожидается высокое использование памяти, если прослушиватель создается для большого количества объектов. Всегда рекомендуется использовать эту функцию для управляемого объема данных. Несколько вещей, которые следует учитывать, — это то, как часто слушатель получает обновления, сколько времени требуется для увеличения памяти.

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