【发布时间】:2020-02-29 20:36:21
【问题描述】:
我创建了一个名为“GetDataFromURL”的函数,它的主要任务是获取数据表单 URL 并存储到本地类数组对象中。 使用 URlSession.shared.dataTask 函数我将数据接收为 DATA 格式,然后通过使用 jsonserialization.jsonObject 方法我进入 json 格式。响应是字典格式,因此存储到临时类对象中,最后它将附加到全局类数组对象中。这个函数被调用,而 Page 被称为“View Load”方法。在函数内,它将显示所有数据,但每次我在块外显示时得到 nil 数组对象。
public class Modelclass : NSObject {
var id :Int!
var albumId : Int!
var title : String!
var url : String!
var thumbnailUrl : string!
}
这是 Class 文件,下面是 viewcontroller 文件:
var temp:[ModelClass]?
override func viewDidLoad() {
super.viewDidLoad()
self.temp = [ModelClass]()
dispatchQueue.main.async{
self.GetDataFromURL()
}
print(self.temp,"Tesing print")
}
func GetDatafromURL() {
if let url = URL(string :
"https://jsonplaceholder.typicode.com/photos"){
URLSession.shared.dataTask(with: url){(data,response,error) in
if error != nil {
print(error)
return
}
do{
let jsonresponse = try jsonserialization.jsonObject(with:data! ,
options: .mutablecontainers)
for dictionary in jsonresponse as! [[String:AnyObject]]
{
var test = ModelClass()
test.title = dictionary["title"] as? String
test.albumId = dictionary["albumId"] as? Int
test.id = dictionary["id"] as? Int
test.thumbnailUrl = dictionary["thumbnailUrl"] as? String
test.url = dictionary["url"] as? String
self.temp?.append(test)
}
}
catch let jsonerror{
print(jsonerror)
}
}.resume()
}
}
它向我显示“ optional([]) Tesing print ”作为输出。在 do 块中打印该临时对象时,它将显示所有数据。
【问题讨论】:
-
您正在进行异步调用,当执行该打印时,您的下载尚未完成。您应该考虑为您的 GetDatafromURL 添加一个闭包
-
您还应该考虑到您的
print调用打印了self.temp和内部GetDatafromURL函数,您将附加到test.temp而不是self.temp。 -
Octavin Marculescu,我写错了。请检查我更新了一个。
标签: ios json swift nsurlsession nsjsonserialization