Я реализовал прослушиватель снимка базы данных Firestore в Swift. Тем не менее, я обнаружил, что весь пользовательский интерфейс контроллера представления действительно запаздывает при обновлении и взаимодействии с ним.
Код также вызывает дополнительную задержку при запуске перехода к этому контроллеру представления, так как он получает изменения документа для всех ранее сохраненных элементов в базе данных. Эта задержка блокирует запуск перехода во время загрузки данных, а затем отображает контроллер представления без какой-либо анимации. Это происходит, когда код находится в viewDidLoad()
или viewWillAppear()
.
Мои первые мысли были GCD. Я попытался обернуть основной код в блок DispatchQueue.main.async
, что устраняет временную задержку, хотя обновления пользовательского интерфейса по-прежнему появляются после получения снимка. Я использовал FirestoreSettings
, чтобы изменить очередь отправки, которую использует пожарный депо, что имеет небольшой эффект (хотя это трудно сказать и может быть эффектом плацебо), но это все еще не решает проблему .
Вот мой текущий код:
struct FirestoreDB {
static let instance = FirestoreDB()
let db: Firestore
init() {
let settings = FirestoreSettings()
settings.isPersistenceEnabled = false
settings.dispatchQueue = DispatchQueue.global(qos: .userInitiated)
self.db = Firestore.firestore()
self.db.settings = settings
}
}
class ViewController: UIViewController {
private let db = FirestoreDB.instance.db
private var reference: CollectionReference?
private var messageListener: ListenerRegistration?
override func viewDidLoad() {
super.viewDidLoad()
self.reference = self.db.collection("...")
self.messageListener = self.reference?.addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else { return }
// Updates the collection view using snapshot.documentChanges
}
}
}
Обновление:
Одна из самых больших жертв лага - клавиатура, которая отправляет подобное сообщение на консоль каждый раз, когда возникает большой момент задержки:
[Common] _BSMachError: port 12b03; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"