我通过JSON获取数据,当我滚动屏幕时,我向服务器发出请求,有时数据可能会结束,然后应用程序在insertRows
崩溃,我该如何解决?
这里是我的代码:
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (!isMoreDataLoading) {
let down = "https://--.com/local/apps/apple/events.php/?nPageSize=\(nPageSize)&iNumPage=\(iNumPage)"
let scrollViewContentHeight = tableView.contentSize.height
let scrollOffsetThreshold = scrollViewContentHeight - tableView.bounds.size.height
if(scrollView.contentOffset.y > scrollOffsetThreshold && tableView.isDragging) {
isMoreDataLoading = true
requestD(url: down)
}
}
}
func requestD(url:String){
var urlRequest = URLRequest(url: URL(string: url)!)
urlRequest.timeoutInterval = 300
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil{
print(error ?? 0)
return
}
do{
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]
if let newsJson = json["EVENTS"] as? [[String : AnyObject]] {
for newJson in newsJson{
let info = Modal()
info.id = newJson["ID"] as? String
info.name = newJson["NAME"] as? String
if newJson["PICTURE"] as? String != nil {
info.ImageViewURL = newJson["PICTURE"] as! String
}
if newJson["PICTURE_DETAIL"] as? String != nil {
info.ImageViewURLDetail = newJson["PICTURE_DETAIL"] as! String
}
info.stmp = newJson["STMP"] as? Int
info.text = newJson["DETAIL_TEXT"] as? String
info.name = info.name?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil)
info.text = info.text?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil)
if self.isRefresh == true {
self.modals.insert(info, at: 0)
} else {
self.modals.append(info)
}
}
}
} catch let error {
print(error)
}
DispatchQueue.main.sync {
self.iNumPage += 1
self.isMoreDataLoading = false
self.Preload.preloadEnd(tableView: self.tableView)
// self.tableView.reloadData()
self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: self.modals.count - 1, section: 0)], with: .automatic)
self.tableView.endUpdates()
}
}
task.resume()
}
原因:'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
答案 0 :(得分:2)
设置新表格行时,不会在数组中添加新数据。
在表中插入新行之前添加此代码self.modals.insert("<#DATA#>, atIndex: yourIndex)
。并尝试删除DispatchQueue
答案 1 :(得分:0)
如果要在tableView中删除/插入元素,则需要执行以下操作:
一些代码来说明这一点(此代码放在didSelectRowAtIndexPath中):
anArray.insert("This String", atIndex: indexPath.row)
tableView.reloadData()