异步调用后更新UITableView的numberOfRowsInSection

时间:2018-08-26 09:48:03

标签: swift uitableview

我有一个UITableView,它需要显示从数据库(异步)下载的消息。可能没有任何消息,所以我想显示一个静态文本,明确指出。问题在于,在将数据下载并缓存到数组中之后,放置在UILabel上的tableView.backgroundView仍然存在。我不知道为什么。这是我的代码:

@IBOutlet weak var tableView: UITableView!    
var messages = [Message]()
var users = [UserModel]()

override func viewDidLoad() {
    super.viewDidLoad()
    loadMessages()
}

 // All of these are called Async
 func loadMessages() {
    guard let userUid = Api.Users.CURRENT_USER?.uid else { return }
    Api.Message.observeUsersMessagesForUser(withId: userUid) { messageKey in
        Api.Message.observeMessage(with: messageKey, completion: { message in
            self.fetchUsers(userId: message.to!, completion: {
                self.messages.append(message)
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            })
        })
    }
}

func fetchUsers(userId: String, completion: @escaping () -> Void) {
    Api.Users.observeUsersShort { user in
        self.users.append(user)
        completion()
    }
}

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if messages.isEmpty {
        showNoDataTableView()
        return 0
    }
    else {
        return messages.count
    }
}

 func showNoDataTableView() {
  //  self.activityIndicator.stopAnimating()
    if messages.isEmpty {
        let noDataLabel: UILabel  = UILabel(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width,
                                                          height: self.tableView.bounds.size.height))
        noDataLabel.numberOfLines = 0
        noDataLabel.text = "No messages yet :( \r\n\n Don't be afraid to start a conversation."
        noDataLabel.textColor = Theme.current.label_noData_textColor
        noDataLabel.font = Theme.current.label_noData_font
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.backgroundView?.backgroundColor = Theme.current.tableView_backgroundView_backgroundColor
        tableView.separatorStyle  = .none
    }
}

1 个答案:

答案 0 :(得分:2)

首先不要将showNoDataTableView()放在numberOfRowsInSection中。只需返回通常的

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return messages.count
}

并将showNoDataTableView()放在loadMessages()的分派异步关闭中

DispatchQueue.main.async {
    self.tableView.reloadData()
    showNoDataTableView()
}

showNoDataTableView()中,您必须检查

  • 如果messages为空并且标签不存在(尚未),请创建标签。
  • 如果messages为空并且标签存在存在,请删除标签。

在其他两种情况下什么也不做。

 func showNoDataTableView() {
  //  self.activityIndicator.stopAnimating()
    if messages.isEmpty && tableView.backgroundView == nil {
        let noDataLabel: UILabel  = UILabel(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width,
                                                          height: self.tableView.bounds.size.height))
        noDataLabel.numberOfLines = 0
        noDataLabel.text = "No messages yet :( \r\n\n Don't be afraid to start a conversation."
        noDataLabel.textColor = Theme.current.label_noData_textColor
        noDataLabel.font = Theme.current.label_noData_font
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.backgroundView?.backgroundColor = Theme.current.tableView_backgroundView_backgroundColor
        tableView.separatorStyle  = .none
    } else if !messages.isEmpty && tableView.backgroundView != nil {
        tableView.backgroundView  = nil
        tableView.separatorStyle  =  // set default style
    }
}