重新启用Firebase Snapshot侦听器(ListenerRegistration)Swift

时间:2020-09-20 11:52:47

标签: ios swift firebase uitableview

我正在使用一个聊天应用程序,希望当用户位于表视图底部时启用Firebase实时侦听器,以便添加新行并自动滚动表视图,但是当用户不在表底部时表格视图我不需要快照侦听器,因为它在用户尝试读取以上消息时会自动滚动表格视图。

我的解决方案:

var listener: ListenerRegistration!

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
   
    heightDictionary[indexPath] = cell.frame.size.height
    
    // Trigger pagination when scrolled to last cell
    if (indexPath.row == commentArray.count - 1) {
 
        // Listener is removed so no more realtime updates and tableview does not scroll automaticly
        listener.remove()
        paginate()
        listernerNeedEnable = true
        
    }
    
    // User is at bottom of table view need to enable listener
    if (indexPath.row == 0) {
        print("indexPath.row == 0")
        if listernerNeedEnable == true {
            print("Re enable listiner")

            // NEED TO RE ENABLE LISTENER HERE !!!
            
            listernerNeedEnable = false
            
            
        }
    }
    
}

1 个答案:

答案 0 :(得分:0)

Firestore建议不要让收听者的“流失率”很高,并且在此用例中不断切换可能会导致这种情况。更好的方法:如果在侦听器触发时表格已触底,请在插入新单元格后滚动到底部,否则只需插入单元格即可。您可以添加此扩展名以简化操作:

extension UIScrollView {
    var isAtBottom: Bool {
        return contentOffset.y >= contentSize.height + contentInset.bottom - bounds.height
    }
}

if tableView.isAtBottom {
    /* insert cells and then scroll to bottom to keep
       the user at the bottom of the screen */
} else {
    /* just insert cells */
}

如果您在插入单元格后表格是在“跳跃”或“滚动”,那么可能正在执行或可能未执行其他操作。

此外,您应该尝试使用performBatchUpdates方法来利用表视图批处理更新。此方法使您有机会在插入单元格(也删除并重新加载)后滚动到底部,这就是您要执行的操作。