当我尝试从各自的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
}


问题是当我调用委托方法(作为数据源所需)时,最初会调用它们,但是当它们是数据变量时,它们仍未更新,因此数据为零。

例如,如果尝试在update func内打印data.count,则会得到结果。但是在任何委托方法(cellForRowAt,numberOfRowsInSection)中,都为零。因此,除了更新功能外,所有与数据变量有关和使用的方法都不会获取数据,因为视图正在加载,但是当用户在搜索字段中输入时数据才出现。

所以问题是如何使委托方法可以访问数据?

最佳答案

我从封包内部收到数据后,忘记更新数据源。

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的正确答案。

关于ios - 数据源未更新单元格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51631977/

10-10 21:14
查看更多