当我调用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的第一个元素的正确单元格。