在 JSON 调用后努力保存数据
Struggling with saving data after JSON call
我正在尝试将 JSON 调用中的数据保存到一个变量中(如果它有所不同,则在 ViewDidLoad 中调用它)。我已经坚持了很长一段时间并且感到非常沮丧。
我知道已经有关于此的主题,但我似乎无法弄明白,我希望对我做错了什么有一个简单的解释。
编辑:在执行 JSON 调用之前,执行转到 "print("breakpoint")" 行,我想强制执行等待,这样我才能真正填满 wantedCARDSET 但我很挣扎如何做到这一点。抱歉,如果不清楚!
这是 viewDidLoad 中的调用
override func viewDidLoad() {
super.viewDidLoad()
setPickerView.dataSource = self
setPickerView.delegate = self
testJSONgrab.getCards(url: "https://mtgjson.com/json/WAR.json") {json, error in
DispatchQueue.main.async {
for item in json {
self.wantedCARDSET.append(item)
}
}
}
print("breakpoint")
getCards 函数
class mtgJSONDATA {
func getCards(url: String, completionHandler: @escaping ([CARDS], Error?)-> Void) {
var cardSet = [CARDS]()
guard let url = URL(string:url) else {return}
let session = URLSession.shared
let task = session.dataTask(with: url, completionHandler: {
(data, response, error) in
if error == nil {
guard let data = data else {return}
do {
let decoded = try JSONDecoder().decode(mtgJSON.self, from: data)
DispatchQueue.main.async {
for item in decoded.cards! {
cardSet.append(item)
}
completionHandler(cardSet, nil)
}
} catch let jsonError {
print("Error serializing JSON: ", jsonError)
}
}
})
task.resume()
}
您错过了重新加载
DispatchQueue.main.async {
self.wantedCARDSET = item
self.setPickerView.reloadAllComponents()
}
因为获取数据的调用是异步的
我正在尝试将 JSON 调用中的数据保存到一个变量中(如果它有所不同,则在 ViewDidLoad 中调用它)。我已经坚持了很长一段时间并且感到非常沮丧。
我知道已经有关于此的主题,但我似乎无法弄明白,我希望对我做错了什么有一个简单的解释。
编辑:在执行 JSON 调用之前,执行转到 "print("breakpoint")" 行,我想强制执行等待,这样我才能真正填满 wantedCARDSET 但我很挣扎如何做到这一点。抱歉,如果不清楚!
这是 viewDidLoad 中的调用
override func viewDidLoad() {
super.viewDidLoad()
setPickerView.dataSource = self
setPickerView.delegate = self
testJSONgrab.getCards(url: "https://mtgjson.com/json/WAR.json") {json, error in
DispatchQueue.main.async {
for item in json {
self.wantedCARDSET.append(item)
}
}
}
print("breakpoint")
getCards 函数
class mtgJSONDATA {
func getCards(url: String, completionHandler: @escaping ([CARDS], Error?)-> Void) {
var cardSet = [CARDS]()
guard let url = URL(string:url) else {return}
let session = URLSession.shared
let task = session.dataTask(with: url, completionHandler: {
(data, response, error) in
if error == nil {
guard let data = data else {return}
do {
let decoded = try JSONDecoder().decode(mtgJSON.self, from: data)
DispatchQueue.main.async {
for item in decoded.cards! {
cardSet.append(item)
}
completionHandler(cardSet, nil)
}
} catch let jsonError {
print("Error serializing JSON: ", jsonError)
}
}
})
task.resume()
}
您错过了重新加载
DispatchQueue.main.async {
self.wantedCARDSET = item
self.setPickerView.reloadAllComponents()
}
因为获取数据的调用是异步的