Firebase Firestore iOS快照侦听器导致UI滞后

时间:2020-05-04 17:35:22

标签: ios swift firebase google-cloud-firestore grand-central-dispatch

我已经在Swift中实现了一个Firestore数据库的快照侦听器。但是,我发现视图控制器的整个UI在更新和与之交互时会变得非常滞后。

向此视图控制器启动segue时,代码还会导致额外的延迟,因为它会获取数据库中所有先前存储的项目的文档更改。这种滞后会阻止序列在加载数据时启动,然后显示视图控制器而没有任何动画。当代码位于viewDidLoad()viewWillAppear()中时,就会发生这种情况。

我最初的想法是GCD。我已经尝试将主要代码包装在DispatchQueue.main.async块中,以理清搜索滞后,尽管UI更新在接收快照后仍然需要一些时间才能出现。我已经使用FirestoreSettings来更改Firestore使用的调度队列,虽然效果不明显(尽管这很难说并且可能是安慰剂的效果),但它仍然不能解决问题。

这是我当前的代码:

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"

0 个答案:

没有答案