我有新的空2变量:
var hallOfFame = ""
var hallOfFameGrupy = ""
和2个主题:
func downloadRankingPersonal(adress : String, adress2 : String, completed: @escaping () -> ()){
let url = URL(string: adress)
let idGry = self.wybranaGra!.id!
print("Startuje 1 wątek")
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error == nil {
var statusRanking = ""
do {
Alamofire.request(adress, method: .get, parameters: nil)
.responseJSON { response in
let jsonResponse = JSON(response.result.value!)
if (jsonResponse["stanyGry"][0]["email"].string == "" || jsonResponse["stanyGry"][0]["email"].string == nil){
statusRanking = "0"
} else{
statusRanking = jsonResponse["stanyGry"][0]["email"].string!
self.hallOfFame = statusRanking
}
}
.responseString { response in
if let error = response.result.error {
print(error)
}
if let value = response.result.value {
print(value)
}
}
DispatchQueue.main.async {
self.hallOfFame = statusRanking
self.downloadRankingGroup(adress: adress2){
}
completed()
}
} catch {
print("JSON ERROR")
self.hallOfFame = ""
}
}
}.resume()
}
func downloadRankingGroup(adress : String, completed: @escaping () -> ()){
let url = URL(string: adress)
let idGry = self.wybranaGra!.id!
print("Startuje 2 wątek")
print("adress 2: \(adress)")
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error == nil {
var statusRanking = ""
do {
Alamofire.request(adress, method: .get, parameters: nil)
.responseJSON { response in
let jsonResponse = JSON(response.result.value!)
let grupy = jsonResponse["ranking"]["grupy"].array
if (grupy!.count > 0) {
statusRanking = "1"
self.hallOfFameGrupy = statusRanking
print("ilosc rekordow: \(grupy!.count)")
} else {
statusRanking = "0"
}
}
.responseString { response in
if let error = response.result.error {
print(error)
}
if let value = response.result.value {
print(value)
}
}
DispatchQueue.main.async {
self.hallOfFameGrupy = statusRanking
if(self.hallOfFame != "" && self.hallOfFameGrupy != "") {
self.checkCodeRankingAlert()
}
completed()
}
} catch {
print("JSON ERROR")
self.hallOfFameGrupy = ""
}
}
}.resume()
}
运行这两个线程之后,我想完成以下变量:hallOfFame和hallOfFameGrupy。
不幸的是,上面的代码正确启动,通过Alamofire下载数据,但不会将下载的数据保存到变量中。这些变量是空的。
有谁知道如何修复它?请帮帮我:)。
答案 0 :(得分:0)
问题不在于你如何填充hallOfFame
或hallOfFameGrupy
,而是填充statusRanking
。当使用闭包时,变量在闭包内被复制并且不是通过引用发送的(因为String
是值,如果它是一个Object,它将被变异)。你只是在Alamofire Closure里面改变状态。 statusRanking
以""
开头,并以""
值复制到Alamofire clsoure中,您在本地进行了变异。而且,你有另一个封闭DispatchQueue.main.async
,它也复制了statusRanking
,它的值仍然是""
。
当你想要实际变异DispatchQueue.main.async
时,将你的hallOfFame
代码移到Alamofire Closure中,它会起作用。
在这种情况下使用一个类(所以你的突变会适用)也不会起作用。因为无法保证你的第二次关闭DispatchQueue.main.async
将在Alamofire Closure被调用后运行。基于速度,有时可能会工作,但你的成功率低于1%。