当我尝试从各自的ViewController内部的闭包中更新数据源(这是在单独的类中自定义)时,它将无法正常工作。
所以这是我用来用
更新数据源的代码extension YelpSearchController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let searchTerm = searchController.searchBar.text else {
return
}
let yelpCoordinate = YLPCoordinate(latitude: 37.785834000000001, longitude: -122.406417)
let yelpClient = YLPClient.init(apiKey: appSecret)
yelpClient.search(with: yelpCoordinate, term: searchTerm , limit: 30, offset: 1, sort: YLPSortType.distance) { [weak self] result, error in
guard let results = result else { return }
let businesses = results.businesses
self?.dataSource.update(with: businesses)
}
}
}
这是仅在数据源类中更新我的数据变量的函数,如下所示:
private var data = [YLPBusiness]()
func update(with data: [YLPBusiness]) {
self.data = data
}
问题是,当我调用委托方法时(根据数据源的要求),它们最初被调用,但是当它们是数据变量时,它们仍未更新,因此数据为nil。
例如,如果我尝试在update func内打印data.count,则会得到结果。但是在任何委托方法(cellForRowAt,numberOfRowsInSection)中,都为零。因此,与数据变量有关的所有方法和使用方法(除了更新功能)都不会获取数据,因为视图正在加载,但是当用户在搜索字段中输入时数据才出现。
所以问题是如何使委托方法可以访问数据?
答案 0 :(得分:0)
在我从封闭内部接收到数据后,忘记更新数据源。
yelpClient.search(with: yelpCoordinate, term: searchTerm , limit: 30, offset: 1, sort: YLPSortType.distance) { [weak self] result, error in
guard let results = result else { return }
let businesses = results.businesses
self?.dataSource.update(with: businesses)
DispatchQueue.main.async {. // added this
self?.tableView.reloadData()
}
非常感谢DonMag的正确答案。