gpt4 book ai didi

ios - 下载JSON数据,然后重新加载 Collection View

转载 作者:行者123 更新时间:2023-12-01 20:11:58 26 4
gpt4 key购买 nike

在这里快速。我有一个叫做NetworkService的类。它具有设置NSURLSession和完成块的方法。我的Object类NewsItem拥有一个方法downloadNewsItems,该方法调用第一个方法并转到url,下载JSON数据,将其附加到数组中并返回它。直到那一点一切都按我的意愿工作。我创建对象并附加它然后返回它(该方法名为downloadImage,但它可以处理任何类型的数据)。

func downloadImage(completion: (NSData -> Void)) {
let request = NSURLRequest(URL: self.url)
let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in

if error == nil {
if let httpResponse = response as? NSHTTPURLResponse {
switch (httpResponse.statusCode) {
case 200:
if let data = data {
completion(data)
}
default:
print(httpResponse.statusCode)
}
}
} else {
print("Error: \(error?.localizedDescription)")
}
}

dataTask.resume()
}

这是我的对象类上相同方法的实现。
static func downloadNewsItems() -> [NewsItem] {

var newsItems = [NewsItem]()

let url = NSURL(string: "http://my-url.com.json")
let networkService = NetworkService(url: url!)

networkService.downloadImage { (data) -> Void in

let jsonData = JSON(data:data)

for item in jsonData["stories"].arrayValue {

// print(item["title"])

let newsArticle = NewsItem()
newsArticle.category = item["category"].string
newsArticle.titleText = item["title"].string
newsArticle.paragraph1 = item["paragraph1"].string
newsArticle.paragraph2 = item["paragraph2"].string
newsArticle.featureImage = NSURL(string: "\(item["headerImage"].string)")
newsArticle.date = item["date"].string
newsArticle.majorReference = item["majorReference"].string
newsArticle.fact = item["fact"].string

newsItems.append(newsArticle)

}

print(newsItems.count)


}

return newsItems

}

print(newsItems.count)显示我已将对象正确下载并更新到字典中。现在问题来了。我有一个 CollectionViewController。我想用从方法调用中获得的数据填充它。我创建了一个数组,并调用了在 ViewDidLoad:内部返回对象的方法,但没有!当我打印时,我得到0,而 collectionView不显示任何单元格。
var newsItems = [NewsItem]()

然后在viewDidLoad中:
newsItems = NewsItem.downloadNewsItems()
print(newsItems.count)
collectionView.reloadData()

对象被下载,由我的init()方法设置,并在NetworkService / NewsItem类内部时添加到该方法的数组中,但是当我从Collection View Controller中调用该方法时,什么也没有。最初,我尝试了默认的JSONSerialisation路由,但是我遇到了同样的问题。我以为也许我做错了。切换到第三方JSON库(SwiftyJSON)...完全相同的问题。请帮忙。我已经有3个星期了。我..我不能。不再..

最佳答案

用户2361090,

您正在进行网络服务调用,以获取downloadNewsItems中的所有newsItems。这是一个异步调用。因此,获取过程然后填充newsItems数组需要一点时间。但是,即使返回之前,您也不必等待它被填充,因此您已经返回了它,因此您将在newsItems = NewsItem.downloadNewsItems()中返回空数组。使用块来移交数据。更改为

static func downloadNewsItems(completionBlock block : ([NewsItem]) -> ()){

var newsItems = [NewsItem]()

let url = NSURL(string: "http://my-url.com.json")
let networkService = NetworkService(url: url!)

networkService.downloadImage { (data) -> Void in

let jsonData = JSON(data:data)

for item in jsonData["stories"].arrayValue {

// print(item["title"])

let newsArticle = NewsItem()
newsArticle.category = item["category"].string
newsArticle.titleText = item["title"].string
newsArticle.paragraph1 = item["paragraph1"].string
newsArticle.paragraph2 = item["paragraph2"].string
newsArticle.featureImage = NSURL(string: "\(item["headerImage"].string)")
newsArticle.date = item["date"].string
newsArticle.majorReference = item["majorReference"].string
newsArticle.fact = item["fact"].string

newsItems.append(newsArticle)

}

print(newsItems.count)
//if the control comes here in background thread because you know you have to reload the collection view which is UI operation change it main thread
dispatch_async(dispatch_get_main_queue(), { () -> Void in
block(newsItems)
})
}

}

最后,您可以将其称为
NewsItem.downloadNewsItems{ (passedArray) -> () in
newsItems = passedArray
collectionView.reloadData()
}

关于ios - 下载JSON数据,然后重新加载 Collection View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585458/

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