Swift - 设计只解析Json一次(当前为每个用户选择解析相同的数据)

时间:2017-10-23 10:59:11

标签: ios json swift

我正在为IOS学习Swift开发,并在我的简单项目中遇到了设计问题。我有一个pickerView设置,以便每次用户选择一个值,显示来自Json的不同信息,它工作得很好。

然而,在我目前的设计中,每当用户从pickerview中选择一个新值时,数据就会被再次解析/获取,我想要做的是收集数据一次然后根据用户循环遍历相同的数据选择。我的猜测是我需要将函数分开来加载数据和函数/代码来实际循环并填充标签。但我似乎找不到任何方法来解决它,当我尝试从我的loadData函数返回一些东西时,我遇到函数内部闭包语句中已经使用的返回问题。

希望你们理解我的问题!

selectedName变量等于pickerView中用户选择的值。 函数loadData在pickerView" didselectrow"内部运行。功能。

func loadData() {
    let jsonUrlString = "Here I have my Json URL"
    guard let url = URL(string: jsonUrlString) else
    { return }
    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else { return }
        do { let myPlayerInfos = try
            JSONDecoder().decode(Stats.self, from: data)
            DispatchQueue.main.async {
                for item in myPlayerInfos.elements! {
                    if item.web_name == self.selectedName{
                        self.nameLabel.text = "Name:\t \t \(item.first_name!) \(item.second_name!)"     
                    } else {}
                }
            }  
        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }
    }.resume()
}//end function loaddata

作为参考,Stats结构:

struct Stats: Decodable {
    let phases: [playerPhases]?
    let elements: [playerElements]?
}

struct playerPhases: Decodable{
    let id: Int?
}

struct playerElements: Decodable {
    let id: Int?
    let photo: String?
    let first_name: String?
    let second_name: String?  
}

0 个答案:

没有答案