如何初始加载UITableView然后观察Firebase节点以进行更改以刷新Swift中的tableview?

时间:2019-05-14 06:33:00

标签: swift firebase uitableview

我正在加载UITableView,其中最初使用UserFirebase提取的observeSingleEvent数据,我理解在初次读取后不会附加观察者。

我还在每个单元格中都有一个图标,该图标在用户在线/离线时会更新。为此,我将observe单元委托方法中对特定User子节点的任何更改附加到观察者willDisplay上,并在didEndDisplaying方法中移除观察者。

这是我第一次这样做,并且工作正常,但是在继续之前,我想知道这是否是最初加载数据然后观察更改的行业标准方法,以便可以为每个单元格相应地更新视图。 / p>

cellForRowAt方法出队并配置单元格:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       guard let cell = tableView.dequeueReusableCell(withIdentifier: "ConversationsListCell", for: indexPath) as? ConversationsListCell else { return UITableViewCell() }

        let message = messages[indexPath.row]


        DataService.run.getUserInfo(forUserId: message.chatPartnerId()!) { (user) in
            cell.configureCell(message: message, user: user)
        }
        return cell

    }//end func

willDisplay方法将观察者附加到特定的子节点,并在该节点发生任何更改时触发tableView.reload():

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        let message = messages[indexPath.row]

        DataService.run.observeUserNodeChages(forId: message.chatPartnerId()!) { (user) in
            self.tableView.reloadData()
        }

    }//end func

didEndDisplaying方法删除由willDisplay方法附加的观察者:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        if indexPath.row < messages.count {

            let message = messages[indexPath.row]
            DataService.run.removeObserveUserNodeChages(forId: message.chatPartnerId()!)
        }

    }//end func

observeUserNodeChages,侦听特定uid子节点上的所有更改

func observeUserNodeChages (forId: String, handler: @escaping (Bool) -> ()){

        print("inside observeUserNodeChages forId:\(forId)")

        conversationListHandle = REF_USERS.child(forId).observe(.childChanged, with: { (snapshot) in

           handler(true)

        }, withCancel: nil)

    }//end func

user节点Firebase结构

enter image description here

1 个答案:

答案 0 :(得分:0)

  

我想知道这是否是行业标准方式

这不是行业标准方法,应避免使用,因为这会导致UI闪烁和响应缓慢。但是,在编码方面,通常没有“标准”,因为为解决问题而编写的代码将根据用例和所需结果而有所不同。

您的tableView数据源应首先从Firebase填充,然后在发生更改时进行更新;将由Firebase事件启动。数据源更新后,请刷新tableView。

这将使应用程序保持响应速度,并使您的用户感到满意。

另一件事是,您似乎在同一(用户)节点内附加了多个观察者。可能没有必要;将您的观察者附加到/ users节点,然后您将收到有关添加,更改或删除事件的通知,并且无论受影响哪个用户,都将作为快照传递到Firebase闭包中。