索引超出Alamofire Swift的功能范围



当我调用let item=stationData[0]时,它说它的索引超出了范围。。。但在我的Alamofire请求中,它返回有数据。。。

下面是我的代码。

我的alamofire在视图中。

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON {
responseData in

if responseData.result.value != nil {
let swiftyJson = JSON(responseData.result.value as Any)
if let data = swiftyJson["data"].arrayObject as? [[String: Any]] {
if data.isEmpty{
print("NO DATA FOUND")
}
else {
self.stationData = data.map(StationData.init)
}
}
}
}

这是我使用stationData 的代码

extension ParameterViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
switch itemType {
case .items:
return parameterName1.count
case .items1:
return parameterName2.count
case .items2:
return parameterName3.count
default:
print("No count to get")
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ValuesViewCell", for: indexPath) as! ValuesViewCell
let item = stationData[0]
switch itemType {
case .items:
cell.setData(parameterName: self.parameterName1[indexPath.row], parameterValue: item.vakue1)
case .items1:

cell.setData(parameterName: self.parameterName2[indexPath.row], parameterValue: item.value2)
case .items2:
cell.setData(parameterName: self.parameterName3[indexPath.row], parameterValue: item.value3)
default:
print("No cell to insert")
}
return cell
}

}

如果数组在加载时还没有准备好,则不应直接通过索引访问数组。

而不是使用

let item = stationData[0]

试试这个

guard let item = stationData.first else { 
return emptyCell
}

这样,您将始终检查您的数组是否包含元素。

此外,当您的数据从Alamofire准备就绪时,您需要刷新tableView。当你设置stationData 时试试这个

else { 
self.stationData = data.map(StationData.init)
self.tableView.reloadData()
}

现在,当您的数据准备就绪时,tableView将重新加载,它将返回带有stationData的第一个元素的正确单元格。

最新更新