# #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:
Вообще говоря, ожидается высокое использование памяти, если прослушиватель создается для большого количества объектов. Всегда рекомендуется использовать эту функцию для управляемого объема данных. Несколько вещей, которые следует учитывать, — это то, как часто слушатель получает обновления, сколько времени требуется для увеличения памяти.
Кроме того, вы можете ограничить количество документов, прочитанных за один раз, установив ограничение и разбиение на страницы.