滚动到底部并添加新行时,UITableView会冻结

时间:2017-03-05 08:29:02

标签: ios swift uitableview

当我滚动到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;

1 个答案:

答案 0 :(得分:2)

非常糟糕的代码设计,您应该将url传递给单元格并让它进行提取和解析,并且您在主队列中执行此操作。您可以使用(使用另一个队列)DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async来执行此操作。 IDK如果Alamofire在主队列上调用你的闭包,但它看起来像是在它上面发出请求。当您想使用DispatchQueue.main.async

进行UI时,不要忘记返回主队列

更新:我希望很明显reloadData(),有点给你一个无限循环,你应该在TableViewDataSource函数之外调用它们

更新2:我在这里看不到,但您应该使用tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)并在其中使用let cell = tableView.dequeueReusableCell.....