【问题标题】:Reload UiTableView After Data Has Been Retrieved From Database - Swift从数据库中检索数据后重新加载 UiTableView - Swift
【发布时间】:2018-10-24 01:27:18
【问题描述】:

如何仅在从数据库加载数据后重新加载 UiTableView。我有一个数据源类,其中包含加载所有数据的函数,并在将数据加载到数组后存储数据。

当我使用 Tableview 访问数据时,它什么也不显示,因为 tableview 在数据库返回其数据之前加载。加载数据的唯一方法是我有一个手动重新加载表格视图的按钮。

从数据库中填充数据源对象中的数组后,如何使 tableview 自动重新加载?

【问题讨论】:

  • 访问数据后,只需按照 Smartcat 所说的调用 tableView.reloadData()
  • 您是否使用核心数据将数据存储在数据库中?

标签: ios database uitableview asynchronous


【解决方案1】:

作为一名新程序员,我花了一段时间才知道这甚至是可能的,但我刚刚意识到完成块是要走的路。只有在您的函数完成从数据库中获取后,它才会执行一些指定的代码。在这种情况下,我可以在从数据库中检索数据之后更新 tableview。这是一个例子。

函数定义:

func getDataFromDatabase(someInput: Any, completion: @escaping(String?) -> Void) {
    let retrievedData: String = databaseCallFunction()        
    // 'Get data from database' code goes here
    // In this example, the data received will be of type 'String?'
    // Once you've got your data from the database, which in this case is a string
    // Call your completion block as follows
    completion(retrievedData)
}

如何调用函数:

getDataFromDatabase(someInput: "Example", completion: { (data) in 
    // Do something with the 'data' which in this example is a string from the database
    // Then the tableview can be updated
    let tableView.title = data
    tableView.reloadTableView
})

完成块中的代码将在数据库调用完成后发生。

【讨论】:

    【解决方案2】:

    填充数据后,为什么不直接调用 tableView.reloadData() 呢?它会重新填充整个表格(从技术上讲,它只会重新创建任何可见的单元格)。

    关键是您的 tableView:cellForRowAt: 方法应该能够访问您的数据,以便根据该数据适当地填充每个表格单元格。每当您的数据发生变化时,只需再次调用 tableView 的 reloadData() 即可。它的效率在于只创建可见单元格,其余的将在它们即将变得可见时创建,如果有的话。

    另外,tableView:numberOfRowsInSection: 应该同样查看您的数据来判断应该存在多少行。每次调用 reloadData() 时也会再次调用它。

    您的数据应始终准备好被 tableView 委托方法查询,即使它尚未包含任何内容。当没有数据时,您的 tableView:numberOfRowsInSection: 将决定应该有 0 行。

    【讨论】:

    • 我可以对数据库中的数据进行分页,并在我开始向下滚动屏幕后重新加载表格视图。但我的问题在于第一组数据的初始加载。仅在从数据库加载数据后,如何调用tableview.reloaddata()。我将使用什么数据源方法来调用它,以及只有在数据库返回其数据后我将如何调用它?
    • 要回答这个问题,我需要查看您的代码。一般来说,听起来您需要将数据库访问与表示 tableView 要显示的数据的数据数组分开。所以基本上在你的视图控制器中有一个属性来保存 tableView 要引用的数组。它总是可引用的,即使它是一个空数组。现在引用数据库的代码,例如从中获取一组过滤的数据,应该更新该数组。无论该代码位于何处,它都需要触发对 tableView.reloadData() 的调用(发送 UINotification 消息,或调用闭包等)
    最近更新 更多