UITableview和异步请求

时间:2016-05-12 08:27:57

标签: ios swift uitableview nsurlsession

我遇到一个问题,如果用户输入搜索栏太快,程序将崩溃,并显示以下消息

  

致命错误:索引超出范围

引用行var podInfo = podcastResults[row],它是cellForRowAtIndexPath方法的一部分。搜索框位于UITableView之上,该NSURLSession是从class SearchTVC: UITableViewController, UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar! var podcastResults = [[String: String]]() var tempDict = [String: String]() func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { print("search being typed") if searchText.characters.count >= 3 { let searchesArray:Array = searchText.componentsSeparatedByString(" ") //request search method to start search(searchesArray) } } func search(searchqueries: Array<String>){ let URL = iTunesSearcher().searchQuery(searchqueries) //This just complies the URL using a method in anothr class let task = NSURLSession.sharedSession().dataTaskWithURL(URL) { (data, response, error) in print("URL downloaded") //clear results and temp dict, so that new results can be displayed self.tempDict.removeAll() self.podcastResults.removeAll() let data = NSData(contentsOfURL: URL) //urlString! let json = JSON(data: data!) for (key, subJson) in json["results"] { if let title = subJson["collectionCensoredName"].string { self.tempDict = ["title": title] } else { print("JSON - no title found") } if let feedURL = subJson["feedUrl"].string { self.tempDict.updateValue(feedURL, forKey: "feedURL") } else { print("JSON - no feedURL found") } if let artworkUrl60 = subJson["artworkUrl60"].string { self.tempDict.updateValue(artworkUrl60, forKey:"artworkURL60") } else { print("JSON - no artwork url found") } self.podcastResults.append(self.tempDict) } //Running request on main thread dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() }) } task.resume() } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) let row = indexPath.row var podInfo = podcastResults[row] cell.textLabel?.text = podInfo["title"] return cell } 结果中填充的。

请参阅下面的代码。

Activity

任何帮助都会非常感激,因为我无法弄清楚。

干杯。

迈克尔

2 个答案:

答案 0 :(得分:0)

尝试从阵列中删除所有元素时重新加载表格,即。 self.tempDict.removeAll() self.podcastResults.removeAll()似乎表格没有刷新,仍然显示现在实际删除的元素。

答案 1 :(得分:0)

我假设您在UITableViewDataSource中返回的行数为self.podcastResults.count。 如果是这样,你需要做的是转过来:

let row = indexPath.row
var podInfo = podcastResults[row]
cell.textLabel?.text = podInfo["title"]

进入

let row = indexPath.row
if row < podcastResults.count {
    var podInfo = podcastResults[row]
    cell.textLabel?.text = podInfo["title"]
}

这将确保无论何时请求单元格,索引都将永远不会超出范围(我认为这会在您从请求处理程序中删除数组中的所有元素之后发生)。