Приемник моментальных снимков Firebase Firestore iOS вызывает задержку пользовательского интерфейса - PullRequest
0 голосов
/ 04 мая 2020

Я реализовал прослушиватель снимка базы данных 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"
...