Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当滚动到底部并添加新行时,UITableView将冻结_Ios_Swift_Uitableview - Fatal编程技术网

Ios 当滚动到底部并添加新行时,UITableView将冻结

Ios 当滚动到底部并添加新行时,UITableView将冻结,ios,swift,uitableview,Ios,Swift,Uitableview,当我滚动到UITableView的底部时,假设应用程序调用一个函数(“CallAlamo(url:nextSearchURL)”),该函数只是将新内容附加到数组中,然后调用tableView.reloadData(),然后tableView会更新为更多内容。但是,在此过程中,tableView完全冻结约2-3秒。我如何才能让它不冻结,并像其他应用程序中的大多数表视图那样工作,在这些应用程序中,新内容正在加载,用户可以自由移动表视图 func tableView(_ tableView: UITa

当我滚动到UITableView的底部时,假设应用程序调用一个函数(“CallAlamo(url:nextSearchURL)”),该函数只是将新内容附加到数组中,然后调用tableView.reloadData(),然后tableView会更新为更多内容。但是,在此过程中,tableView完全冻结约2-3秒。我如何才能让它不冻结,并像其他应用程序中的大多数表视图那样工作,在这些应用程序中,新内容正在加载,用户可以自由移动表视图

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代码。我一定会去看看的!谢谢!