我已经在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"