gpt4 book ai didi

ios - 使用 dataTaskWithRequest 填充 uitableview

转载 作者:行者123 更新时间:2023-11-30 13:59:52 24 4
gpt4 key购买 nike

我有一个方法,它为我解析 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)
}

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

最佳答案

在你的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()

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

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

此外,查看有关 iOS 下线程的文档也不是一个坏主意: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

关于ios - 使用 dataTaskWithRequest 填充 uitableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33128755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com