【问题标题】:Populate uitableview with dataTaskWithRequest使用 dataTaskWithRequest 填充 uitableview
【发布时间】:2015-10-14 14:55:13
【问题描述】:

我有一个方法,它为我解析 JSON,然后在关闭时加载并将图像保存到磁盘。此方法在 viewDidLoad 中被调用。然后加载表。问题是,当表格加载时,它里面只有一个单元格,因为 dataTaskWithRequest 没有足够的时间在表格加载时下载所有信息。所以它会加载一个单元格,然后如果我按下一个链接到函数 tableView.reloadData() 的按钮,则会出现另一个单元格。

如何让 tableView 等待 dataTaskWithRequest 并仅在从互联网获取完成后才显示它自己?

我在 viewDidLoad 中调用的方法如下所示

var JSONStorage : [Article?]?
var objects = [Article?]()
var imgPath : String?

var battlesArticlesListImgPath : String?
var battleArticlesListHash : String?
var battleArticlesListArray = [ArticlesList?]()

@IBOutlet weak var tableView: UITableView!

@IBAction func button(sender: AnyObject) {

    print(battleArticlesListArray)
    print(battleArticlesListHash)
    dump(battleArticlesListArray)
    self.tableView.reloadData()

}

override func viewDidLoad() {
    super.viewDidLoad()

    downloadBattlesArticlesList()

func downloadBattlesArticlesList() {

    let number = arc4random_uniform(1000)
    let urlString = "http://78.27.190.58:3200/api/category_listing/0/0/?\(number)"


    if let url = NSURL(string: urlString) {
        if let data = try? NSData(contentsOfURL: url, options: []) {
            var json = JSON(data: data)

            self.battleArticlesListHash = json["content_version"].stringValue

            let UserDefaults = NSUserDefaults.standardUserDefaults()
            UserDefaults.setValue(self.battleArticlesListHash, forKey: "battleArticlesListHash")

            print("preved")

            for element in json["listing"].arrayValue {

                let id = Int(element["id"].stringValue)
                let title = element["title"].stringValue
                let subtitle = element["subtitle"].stringValue
                let img = element["image"].stringValue

                let url = NSURL(string: img)
                let urlRequest = NSURLRequest(URL: url!)
                let task = NSURLSession.sharedSession().dataTaskWithRequest(urlRequest, completionHandler: {

                    (data, response, error) -> Void in

                    let image = UIImage(data: data!)

                    var documentsDirectory:String?

                    var paths:[AnyObject] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)

                    if paths.count > 0 {

                        documentsDirectory = paths[0] as? String

                        var savePath = documentsDirectory! + "/\(self.randomStringWithLength(5)).jpg"

                        self.battlesArticlesListImgPath = savePath

                        NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil)

                        let obj:ArticlesList = ArticlesList(id: id!, title: title, subtitle: subtitle, image: self.battlesArticlesListImgPath!)

                        self.battleArticlesListArray.append(obj)

                    }
                })

            task.resume()

            }

        }
    }

    print(battleArticlesListArray)
}

最终打印在执行时也显示空数组。

【问题讨论】:

标签: ios swift uitableview


【解决方案1】:

在你的 viewDidLoad 中,隐藏你的 tableView:

tableView.hidden = true

这里之后调用tableView.reloadData()

     if paths.count > 0 {

                            documentsDirectory = paths[0] as? String

                            var savePath = documentsDirectory! + "/\(self.randomStringWithLength(5)).jpg"

                            self.battlesArticlesListImgPath = savePath

                            NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil)

                            let obj:ArticlesList = ArticlesList(id: id!, title: title, subtitle: subtitle, image: self.battlesArticlesListImgPath!)

                            self.battleArticlesListArray.append(obj)

                        }
tableView.hidden = false
tableView.reloadData()

这是因为您的任务被置于后台。一旦它返回了一些值,并且您的所有任务都完成了,只需刷新 tableview。

打印空值的原因是因为它在数据返回之前就被执行了。

另外,在 iOS 下查看有关线程的文档也不错: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2014-02-08
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多