Swift - 将值从线程保存到变量

时间:2018-03-13 12:35:40

标签: ios swift

我有新的空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下载数据,但不会将下载的数据保存到变量中。这些变量是空的。

有谁知道如何修复它?请帮帮我:)。

1 个答案:

答案 0 :(得分:0)

问题不在于你如何填充hallOfFamehallOfFameGrupy,而是填充statusRanking。当使用闭包时,变量在闭包内被复制并且不是通过引用发送的(因为String是值,如果它是一个Object,它将被变异)。你只是在Alamofire Closure里面改变状态。 statusRanking""开头,并以""值复制到Alamofire clsoure中,您在本地进行了变异。而且,你有另一个封闭DispatchQueue.main.async,它也复制了statusRanking,它的值仍然是""。 当你想要实际变异DispatchQueue.main.async时,将你的hallOfFame代码移到Alamofire Closure中,它会起作用。

重要

在这种情况下使用一个类(所以你的突变会适用)也不会起作用。因为无法保证你的第二次关闭DispatchQueue.main.async将在Alamofire Closure被调用后运行。基于速度,有时可能会工作,但你的成功率低于1%。