当我滚动到UITableView的底部时,app会假设调用一个函数(" CallAlamo(url:nextSearchURL)"),它只是将新内容附加到数组,然后调用tableView.reloadData (),然后使用更多内容更新tableview。但是,在此过程中,tableView会完全冻结约2-3秒。如何在不加载新内容并且用户可以自由移动tableview的其他应用程序中像大多数表视图那样使其不冻结和工作。
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()
}
}
更新
这就是callAlamo的作用:
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)
}
}
更新2
使用@ Anbu.Karthik选择2:
问题1:&#34; imageData&#34;将成为我的&#34; mainImagedata&#34;?
问题2:我在Alamofire.request中收到错误...说&#34;额外的争论&#39;方法&#39;在电话&#34;当我删除它时,我得到一个错误,说&#34; NSData?没有下标成员&#34;
答案 0 :(得分:2)
非常糟糕的代码设计,您应该将url传递给单元格并让它进行提取和解析,并且您在主队列中执行此操作。您可以使用(使用另一个队列)DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
来执行此操作。 IDK如果Alamofire在主队列上调用你的闭包,但它看起来像是在它上面发出请求。当您想使用DispatchQueue.main.async
更新:我希望很明显reloadData(),有点给你一个无限循环,你应该在TableViewDataSource函数之外调用它们
更新2:我在这里看不到,但您应该使用tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
并在其中使用let cell = tableView.dequeueReusableCell.....