簡體   English   中英

下載數據后表視圖未更新

[英]the table view is not being updated after download the data

首先,為了避免英語不好,我上傳了一段視頻,展示了我的問題

http://www.mediafire.com/download/j6krsa274o80ik9/Screen_Recording.mov

其次,我有一個UITableViewController,它使用遠程API下載數據。 數據包含許多圖像URL,我的第一個問題是即使我正在執行.reloadData()函數,tableView也不會被更新

我的第二個問題是在函數中:

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

我下載了圖片,這些圖片是我從第一次調用中獲得的網址,然后一切正常,但除非單擊該行,否則看不到圖片

請看視頻,更容易理解

這是我的代碼:(我為您提供了UITableView的完整代碼,因為它很簡單,並且因為它具有兩個函數,而這兩個函數使我感到麻煩)

class Physicst: NSObject {
    let image : String
    var imageData: UIImage?
    let name : NSString
    init(image: String, name: NSString) {
        self.image = image
        self.name = name
    }
}

class PhysicistTableViewController: UITableViewController {

    var physicsts : [Physicst]?

    @IBOutlet var physicstsTableView: UITableView!



    override func viewDidLoad() {
        super.viewDidLoad()
        loadDataFromDBPedia()
    }

    func loadDataFromDBPedia()  {
        let session = NSURLSession.sharedSession()
        var url = "http://dbpedia.org/sparql/"
        let query = "http://dbpedia.org&query=select * {?o  dbo:thumbnail ?p . ?o dbo:award dbr:Nobel_Prize_in_Physics} limit 10"
        url = url + "?default-graph-uri=" + query.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
        url = url + "&format=JSON&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on"
        let request = NSMutableURLRequest(URL: NSURL(string: url)!)
        let task = session.dataTaskWithRequest(request, completionHandler: {(data, response ,error) in
            if let error = error {
                print ("\(error)")
            }
            if let response = response {
                let httpResponse = response as! NSHTTPURLResponse
                let statusCode = httpResponse.statusCode
                print("Status code = \(statusCode)")
            }
            if let data = data  {
                do {
                    let jsonResponse = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
                    let binding = jsonResponse["results"]!!["bindings"] as! NSArray
                    for oneBinding in binding {
                        let name = oneBinding["o"]!!["value"] as! NSString
                        var image = oneBinding["p"]!!["value"] as! String
                        image = image.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
                        let physicst = Physicst(image: image, name: name)
                        if self.physicsts == nil {
                            self.physicsts = [Physicst]()
                        }
                        self.physicsts!.append(physicst)
                    }
                    self.physicstsTableView.reloadData()
                }catch _ {
                    print ("not well json-formatted response")
                }
            }
        })
        task.resume()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.physicsts == nil {
            return 0
        }else {
            return self.physicsts!.count
        }
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("physicstCell")! as UITableViewCell
        let row = indexPath.row
        let physicst = self.physicsts![row]
        cell.textLabel?.text = physicst.name as String
        if (physicst.imageData == nil) {
            let session = NSURLSession.sharedSession()
            let url = NSURL(string: physicst.image as String)
            if let url = url {
                let request = NSMutableURLRequest(URL: url)
                let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
                    if let data = data {
                        let imageData = UIImage(data: data)
                        cell.imageView?.image = imageData
                        physicst.imageData = imageData
                        self.physicstsTableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
                    }
                })
                task.resume()
            }else {
                print ("nill URL \(physicst.image)")
            }
        }else {
            cell.imageView?.image = physicst.imageData!
        }
        return cell
    }
}

**隨意復制/粘貼它,沒有自定義單元格,因此應該可以工作**

tableView重新加載應在主線程上調用。 在后台線程上調用session.dataTaskWithRequest完成塊在后台線程上執行UI操作可能會導致嚴重的后果。 我相信您所面臨的問題只是這些后果之一。 修改代碼,如下所示。

func loadDataFromDBPedia()  {
            let session = NSURLSession.sharedSession()
            var url = "http://dbpedia.org/sparql/"
            let query = "http://dbpedia.org&query=select * {?o  dbo:thumbnail ?p . ?o dbo:award dbr:Nobel_Prize_in_Physics} limit 10"
            url = url + "?default-graph-uri=" + query.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
            url = url + "&format=JSON&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on"
            let request = NSMutableURLRequest(URL: NSURL(string: url)!)
            let task = session.dataTaskWithRequest(request, completionHandler: {(data, response ,error) in
                if let error = error {
                    print ("\(error)")
                }
                if let response = response {
                    let httpResponse = response as! NSHTTPURLResponse
                    let statusCode = httpResponse.statusCode
                    print("Status code = \(statusCode)")
                }
                if let data = data  {
                    do {
                        let jsonResponse = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
                        let binding = jsonResponse["results"]!!["bindings"] as! NSArray
                        for oneBinding in binding {
                            let name = oneBinding["o"]!!["value"] as! NSString
                            var image = oneBinding["p"]!!["value"] as! String
                            image = image.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
                            let physicst = Physicst(image: image, name: name)
                            if self.physicsts == nil {
                                self.physicsts = [Physicst]()
                            }
                            self.physicsts!.append(physicst)
                        }
                        dispatch_async(dispatch_get_main_queue()) { () -> Void in
                             self.physicstsTableView.reloadData()
                        }
                    }catch _ {
                        print ("not well json-formatted response")
                    }
                }
            })
            task.resume()
        }


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("physicstCell")! as UITableViewCell
        let row = indexPath.row
        let physicst = self.physicsts![row]
        cell.textLabel?.text = physicst.name as String
        if (physicst.imageData == nil) {
            let session = NSURLSession.sharedSession()
            let url = NSURL(string: physicst.image as String)
            if let url = url {
                let request = NSMutableURLRequest(URL: url)
                let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
                    if let data = data {
                        dispatch_async(dispatch_get_main_queue(), { () -> Void in
                            let imageData = UIImage(data: data)
                            cell.imageView?.image = imageData
                            physicst.imageData = imageData
                            self.physicstsTableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
                        })
                    }
                })
                task.resume()
            }else {
                print ("nill URL \(physicst.image)")
            }
        }else {
            cell.imageView?.image = physicst.imageData!
        }
        return cell
    }

小費

手動為每個單元格下載圖像,然后將其加載到tableViewCell並進行緩存以提高滾動性能,就像在使用無胎輪胎時重新發明輪子一樣:)請考慮使用SDWebImageAFNetworking我個人使用過SDWebImage和它的緩存功能完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM