我的Tableview在开始从firebase加载数据时没有响应任何触摸。 (它已经显示了单元格,但没有反应)一段时间后,它会在tableview没有反应时尝试滚动。
var filteredData = [archivCellStruct]()
func firData() {
filteredData.removeAll()
var databaseRef : DatabaseReference!
databaseRef = Database.database().reference()
databaseRef.child("Aufträge").child("Archiv").queryOrderedByKey().observe(.childAdded, with:{
snapshot in
let snap = snapshot.value as? NSDictionary
//extracting the data and appending it to an Array
self.filteredData.append(//myData)
self.tableView.reloadData()
})
}
因此它适用于较少量的数据(tableview行),但延迟很大(我已经过滤数据以限制tableView中显示的数据)。我认为这与tableView.reloadData()有关(可能在重新加载时禁用了userinteraction?)
每次你必须异步重新加载你的tableview -
var filteredData = [archivCellStruct]()
func firData() {
filteredData.removeAll()
var databaseRef : DatabaseReference!
databaseRef = Database.database().reference()
databaseRef.child("Aufträge").child("Archiv").queryOrderedByKey().observe(.childAdded, with:{
snapshot in
let snap = snapshot.value as? NSDictionary
//extracting the data and appending it to an Array
self.filteredData.append(//myData)
DispatchQueue.main.async { //change this in you code
self.tableView.reloadData()
}
})
}
使用firebase,您可以手动方式:
用例:
struct UseCaseName {
struct Request {}
struct Response {
let firebaseCallbackData: [FirebaseModelType]
}
struct ViewModel {
let data: [DisplayType]
}
}
视图控制器:
var filteredData: [DisplayType]! = []
override func viewWillAppear() {
// this one can make you trouble, adjust the observation logic to whatever you need. `WillAppear` can fire multiple times during the view lifecycle
super.viewWillAppear()
interractor?.observe()
}
func showData(viewModel: Scene.Usecase.ViewModel) {
// this is where the different approach begins
tableView.beginUpdates()
var indexPaths = [NSIndexPath]()
for row in (filteredData.count..<(FilteredData.count + viewModel.data.count)) {
indexPaths.append(NSIndexPath(forRow: row, inSection: 0))
}
filteredData += viewModel.data
tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
tableView.endUpdates()
}
Interractor:
func observe(request: Scene.UseCase.Request) { /* signup for updates with observe(_ eventType: DataEventType, with block: @escaping (DataSnapshot) -> Void) -> UInt */
callback is something like { DataSnapshot in presenter.presentData(response: Scene.Usecase.Response())
}
主持人:
func presentData(response: Scene.UseCase.Response) {
/* format for representation */
DispatchQueue.main.async {
controller.present(viewModel: Scene.UseCase.ViewModel())
}
}
对不起流动的分离,我已经沉迷于这种方式。另外我假设,firebase中的数据没有被修改,但是添加了(因为observe(.childAdded,
部分。如果我错了,请编辑你的问题以反映这一点。另一个假设是你有单个部分.Don'忘记将inSection: 0
更改为正确的部分。我很懒,而且对移动设备不友好这种方式只会附加Firebase发送的新值并且工作得更快
编辑:另一个答案。
DispatchQueue.main.async { //change this in you code
self.tableView.reloadData()
}
有时重新加载所有项目都不好。但这取决于计数。如果我的假设是正确的,那么更新单独的单元格而不重新加载整个表格会更好。快速示例:类似于与Firebase“后端”聊天的内容。解释:添加单行将比reloadData()更快地工作,但只有当您经常调用这些方法时,差异才会很大。通过聊天示例,如果聊天是垃圾邮件以优化控制器中的UITableView重新加载行为,则差异可能非常大。
同样很高兴看到影响方法的代码。它可能是一个线程问题,就像John Ayers在评论中所说的那样。你在哪里打电话给func firData()
?