Ios 当滚动到底部并添加新行时,UITableView将冻结
当我滚动到UITableView的底部时,假设应用程序调用一个函数(“CallAlamo(url:nextSearchURL)”),该函数只是将新内容附加到数组中,然后调用tableView.reloadData(),然后tableView会更新为更多内容。但是,在此过程中,tableView完全冻结约2-3秒。我如何才能让它不冻结,并像其他应用程序中的大多数表视图那样工作,在这些应用程序中,新内容正在加载,用户可以自由移动表视图Ios 当滚动到底部并添加新行时,UITableView将冻结,ios,swift,uitableview,Ios,Swift,Uitableview,当我滚动到UITableView的底部时,假设应用程序调用一个函数(“CallAlamo(url:nextSearchURL)”),该函数只是将新内容附加到数组中,然后调用tableView.reloadData(),然后tableView会更新为更多内容。但是,在此过程中,tableView完全冻结约2-3秒。我如何才能让它不冻结,并像其他应用程序中的大多数表视图那样工作,在这些应用程序中,新内容正在加载,用户可以自由移动表视图 func tableView(_ tableView: UITa
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = posts.count - 1
if indexPath.row == lastElement {
callAlamo(url: nextSearchURL) //appends new content to array
tableView.reloadData()
}
}
更新
这就是卡拉莫所做的:
func callAlamo(url : String){
Alamofire.request(url).responseJSON(completionHandler: {
response in
self.parseData(JSONData: response.data!)
})
}
func parseData(JSONData : Data){
do{
var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
//print(readableJSON)
if let tracks = readableJSON["tracks"] as? JSONStandard{
nextSearchURL = tracks["next"] as! String
if let items = tracks["items"] as? [JSONStandard]{
//print(items) //Prints the JSON information from Spotify
for i in 0..<items.count{
let item = items[i]
let name = item["name"] as! String
let previewURL = item["preview_url"] as! String
if let album = item["album"] as? JSONStandard{
if let images = album["images"] as? [JSONStandard],let artist = album["artists"] as? [JSONStandard]{
let imageData = images[0] //this changes the quality of the album image (0,1,2)
let mainImageURL = URL(string: imageData["url"] as! String)
let mainImageData = NSData(contentsOf: mainImageURL!)
let mainImage = UIImage(data: mainImageData as! Data)
let artistNames = artist[0]
let artistName = artistNames["name"] as! String
posts.append(post.init(mainImage: mainImage, name: name, artistName: artistName, previewURL: previewURL))
self.tableView.reloadData()
}
}
}
}
}
} catch{
print(error)
}
}
func callAlamo(url:String){
Alamofire.request(url).responseJSON(completionHandler:{
回应
self.parseData(JSONData:response.data!)
})
}
func parseData(JSONData:Data){
做{
var readableJSON=try JSONSerialization.jsonObject(使用:JSONData,选项:.mutableContainers)作为!JSONStandard
//打印(可读JSON)
如果让tracks=readableJSON[“tracks”]as?json标准{
nextSearchURL=以!字符串形式跟踪[“下一步”]
如果let items=跟踪[“items”]为?[json标准]{
//print(items)//从Spotify打印JSON信息
对于0中的i..非常糟糕的代码设计,您应该将url传递给单元格,让它执行抓取和解析,并且您正在主队列上执行此操作。您可以使用(使用另一个队列)DispatchQueue.global(qos:DispatchQoS.QoSClass.userInitiated)来执行此操作.async
.IDK如果Alamofire在主队列上调用您的闭包,但它看起来像是在主队列上执行了请求。并且当您想使用DispatchQueue.main.async对UI执行操作时,不要忘记返回主队列
更新:我希望很明显,reloadData()会给您一个无限循环,您应该在TableViewDataSource函数之外调用这些函数
更新2:我在这里没有看到它,但是你应该使用tableView(\utableview:UITableView,cellForRowAt indexath:indexPath)
并在其中使用let cell=tableView.dequeueReusableCell…..
不需要这个tableView.reloadData()
你能显示callAlamo的代码吗(u
@Anbu.Karthik okay刚刚更新了它。我知道我在callAlamo中也调用了tableView.reloadData()。但是,我在tableView func中取出tableView.reloadData(),它仍然会冻结。当然需要,bz您使用的是让mainImageURL=URL(string:imageData[“URL”]as!string)让mainImageData=NSData(内容:mainImageURL!)
,它将影响主线程,直接将字符串传递到数组,并在cellforRowAt@Anbu.Karthik interest中检索数组到图像。我是新手。你能用一些代码回答这个问题吗?我明白了,我明白了。谢谢你的回答!我对你将url传递到单元格和“让它做抓取和解析”。你介意给出一些示例代码来说明如何做你所说的吗?你需要为cell创建一个类这是一个示例(当然是在cell的类中):@originalalchemation你应该学习斯坦福大学的iOS开发课程,才能真正领略到好的iOS代码。我一定会去看看的!谢谢!