Arrays 如何修复';索引超出范围';JSON解析的应用程序中出现错误

Arrays 如何修复';索引超出范围';JSON解析的应用程序中出现错误,arrays,swift,Arrays,Swift,我发现我的电脑有一个小问题。我遇到的问题是,我的限额调用工作正常,但如果运行它并切换显示的金额选项几次,索引超出范围的错误将出现 只有在您快速运行或不更改搜索时,才会出现这种情况。我花了4个小时在这个问题上,觉得我只是没有看到一些真正简单的东西!谢谢大家! override func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{ let cell=tableView.deque

我发现我的电脑有一个小问题。我遇到的问题是,我的限额调用工作正常,但如果运行它并切换显示的金额选项几次,索引超出范围的错误将出现

只有在您快速运行或不更改搜索时,才会出现这种情况。我花了4个小时在这个问题上,觉得我只是没有看到一些真正简单的东西!谢谢大家!

override func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
let cell=tableView.dequeueReusableCell(标识符为:“TableViewCell”,表示:indexath)
让searchResult=searchResultsController.searchResults[indexPath.row]
cell.textlab?.text=searchResult.title
cell.detailTextLabel?.text=searchResult.creator
返回单元
}
//马克:行动
@iAction func filterButtonPressed(u发送方:UIBarButtonItem){
如果limitSearchButton.title==“显示10”{
limit.limit=“10”
limitSearchButton.title=“显示5”
打印(“限制为\(字符串(描述:limit.limit)))
searchBarSearchButtonClicked(搜索栏)
tableView.reloadData()
}如果limitSearchButton.title==“显示5”,则为else{
limit.limit=“5”
limitSearchButton.title=“显示10”
打印(“限制为\(字符串(描述:limit.limit)))
searchBarSearchButtonClicked(搜索栏)
tableView.reloadData()
}
}
@iAction func segmentedControlChanged(\发送方:UISegmentedControl){
如果sender.selectedSegmentIndex==0{
searchBarSearchButtonClicked(搜索栏)
self.tableView.reloadData()
}如果sender.selectedSegmentIndex==1,则为else{
searchBarSearchButtonClicked(搜索栏)
self.tableView.reloadData()
}否则{
searchBarSearchButtonClicked(搜索栏)
self.tableView.reloadData()
}
}
}
扩展SearchResultsTableViewController:UISearchBarDelegate{
func searchBar searchbutton单击(searchBar:UISearchBar){
guard let searchTerm=searchBar.text else{return}
开关分段控制。选择分段索引{
案例0:
结果类型=.software
案例1:
结果类型=.musicTrack
案例2:
结果类型=.movie
违约:
打破
}
searchResultsController.performSearch(searchTerm:searchTerm,resultType:resultType,limit:limit){
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
}
}
我希望通过我的打印语句和过滤功能,获得限额金额,并将其与更新我的按钮一起返回。但在使用了几次UIBarButton函数之后,我什么也没有得到。

为什么会崩溃? 这是线程之间的竞争条件(当异步获得新结果时)

有时您试图显示4个元素,但您的数据源刚刚更新,现在有3个元素。模型更改时缺少同步

对于所有重新加载数据的调用,网络请求返回的时间很有可能是相同的,我怀疑这是导致崩溃的原因

API修复 强制执行并发的一种方法是将所有并发同步工作移到API上,这样API的使用者就不必考虑它是如何工作的。(不再有客户端调度异步调用)

在API逻辑中,使用
DispatchQueue.main.async{}
块包装每个
completion()
处理程序调用,以及对ViewController中访问的公共属性的更改。该调度队列将强制在不同的线程上不发生UI更新

在ViewController中调用的任何API都将位于同一主线程上,因此只要将这些块放在每个适当的位置,就可以获得线程安全性

由于您没有提供该代码,我将在提供另一个iOS项目的代码示例

在URLSession/网络代码中,您的逻辑如下所示:

URLSession.shared.dataTask(带:url){(数据,\错误)在
如果let error=error{
打印(“获取地震时出错:\(错误)”)
DispatchQueue.main.async{//Wrap每个对completion()的调用
完成(无,错误)
}
返回
}
guard let data=其他数据{
DispatchQueue.main.async{
完成(无,QuakeError.noDataReturned)
}
返回
}
做{
let decoder=JSONDecoder()
decoder.dateDecodingStrategy=.毫秒ssince1970
让quakeResults=try decoder.decode(quakeResults.self,from:data)
DispatchQueue.main.async{
//设置公共财产也需要受到保护
//在main.async块中,除了
//completion()处理程序调用
self.quakes=quakeResults.features//保护公共财产
完工(地震,无)
}
}抓住{
DispatchQueue.main.async{
完成(无,错误)
}
}
}1.简历()

这可能是线程之间的竞争条件(当您获得新结果时)。尝试将DispatchQueue.main.async{}调用移动到searchResultsController类中,围绕每个完成块。这样打电话的人就不用担心了,是保罗!非常感谢。如果你把这个解决方案作为一个答案,我会把它标记为:)