从firebase加载数据时,UITableview不响应

问题描述 投票:0回答:2

我的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?)

ios swift uitableview firebase reload
2个回答
1
投票

每次你必须异步重新加载你的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()
            }

    })
} 

1
投票

使用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()

© www.soinside.com 2019 - 2024. All rights reserved.