Ios 调用tableView.reloadData()时UITableView未更新,是什么导致此问题?

Ios 调用tableView.reloadData()时UITableView未更新,是什么导致此问题?,ios,swift,uitableview,asynchronous,uisearchbar,Ios,Swift,Uitableview,Asynchronous,Uisearchbar,我有一个表视图,最初是空的。一旦一个异步方法被称为Networking(),我就会尝试更新它。fetchRecipes(成分:searchText)。但是,调用此方法后,recipieTableView仍不受欢迎。这一错误的原因是什么?下面是我正在运行的代码,每次文本字段中的文本更改时都应该运行该代码。我知道这是可行的,因为我也在打印API调用的结果 @IBOutlet weak var recipieTableView: UITableView! var recipies = LocalDat

我有一个表视图,最初是空的。一旦一个异步方法被称为
Networking(),我就会尝试更新它。fetchRecipes(成分:searchText)
。但是,调用此方法后,
recipieTableView
仍不受欢迎。这一错误的原因是什么?下面是我正在运行的代码,每次文本字段中的文本更改时都应该运行该代码。我知道这是可行的,因为我也在打印API调用的结果

@IBOutlet weak var recipieTableView: UITableView!
var recipies = LocalData.recipies.recipieList
var filteredRecipies = [Recipie]()
    
    
override func viewDidLoad() {
    filteredRecipies = recipies
    super.viewDidLoad()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
     Networking().fetchRecipies(ingredients: searchText)
     self.recipieTableView.reloadData()
     DispatchQueue.main.async {
         self.recipieTableView.reloadData()
         self.recipieTableView.beginUpdates()
         self.recipieTableView.endUpdates()
     }
}

但是,调用此方法后,recipieTableView仍不受欢迎。这一错误的原因是什么

导致错误的原因是,当你说“之后”时,你实际上应该说“之前”!您的代码没有按编写顺序运行。它按以下顺序运行:

 Networking().fetchRecipies(ingredients: searchText) // 2
 self.recipieTableView.reloadData() // 1...
 // ...
换句话说,所有对
reloadData
的调用都是在获取配方之前进行的


您需要编写
fetchRecipes
,以便它在抓取完成后重新加载表视图。

您说的方法是
Networking()。fetchRecipies(配料:)
是异步调用的,这基本上意味着您的代码进入另一个线程,同时继续执行,直到调用异步函数的方法结束

因此,当数据尚未填充时,将调用行
self.recipieTableView.reloadData()

然后调用
DispatchQueue.main.async
,这也是不必要的。由于您已经在主线程上(因为这是
searchBar(\uu:textDidChange:)
)的惯例,对于大多数UIKit方法,您的方法所做的唯一事情就是在一段时间后运行已调度代码块的内容(但在您的获取请求完成之前,仍然有可能要快得多)

在官方网站上阅读更多关于并发如何在iOS上工作的信息。如果您是初学者,了解串行队列和并发队列以及
sync
async
调度之间的区别就足够了

回到你的问题上来。我建议您检查
网络
类的API,并检查是否有任何方法在实际获取数据时通知您。大多数iosapi都提供了一个完成块,该块是用作为参数传递的新获取的数据执行的。例如,它可能如下所示:

Networking().fetchRecipies(ingredients: searchText, completion: { fetchedIngredients in 
   // ... update your data source array
   // reload table view
})
如果在主队列上调用,则直接从此类块内部调用
tableView.updateData()
;如果从后台队列调用了完成块,则将其包装在
DispatchQueue.main.async{}
内部(请参阅API以找到它)


而且,最重要的是,在调用
updateData()

之前,不要忘记更新数组(我相信它是
Recipes
filteredRecipies
),它是表数据的源,也许您还没有为表视图设置
数据源?此外,调用
fetchRecipies
后,您似乎正在尝试立即重新加载表视图,但这是一种异步方法吗?它是否执行网络请求?如果是这样,您应该在请求完成后重新加载表。如果没有更多关于
fetchRecipies
正在做什么的信息,我们无法发表评论。。。