首页 > 解决方案 > swift 5 ios:如何从 session.dataTask 完成处理程序中获取数据

问题描述

我有下面的代码,它不完整,例如。

    func getUserData() {
        var user: UserData // creates an empty userdata object
        // setup for session.dataTask below, skipping since this isn’t my question
        let task = session.dataTask(with: url) {(data, response, error) in
            …
            // process data here
            let json = JSONSERializable.jsonobject…
            // How can I get the json variable out into the function?
            // Because I can do something like:
            let id = json[“id”] as? String ?? “”
            let name = json[“name”] as? String ?? “”
            // And I would want to do something like:
            userdata.id = id
            userData.name = name
        }
        task.resume()
    }

但上面的用户数据。陈述是错误的,我似乎无法理解这个概念。

我有一个应用程序,它向一个 restful api 发出大量请求,我得到了 json 数据有效负载以在应用程序中使用。所以我有很多这些类型的数据调用,并且想创建一个方法类来访问远程数据库的各个方面。

任何帮助将不胜感激。

标签: iosswift

解决方案


这段代码对我有用:

    func loadJson(fromURLString urlString: String,
                      completion: @escaping (Result<Data, Error>) -> Void) {
    if let url = URL(string: urlString) {
        let urlSession = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in
            if let error = error {
                completion(.failure(error))
            }
            
            if let data = data {
                completion(.success(data))
            }
        }
        urlSession.resume()
    }
}

并使用:

 loadJson(fromURLString: urlString) { (result) in
    switch result {
    case .success(let data):
        // Parse your Json: I call a function Parse that does it
        //if let decodedJson = GetJson.parse(jsonData: data) {
            //DispatchQueue.main.async {
                //Use your decodedJson
                //print(decodedJson.id)
                //print(decodedJson.name)
            //}
                
       }
    case .failure(let error):
        print(error)         
    }
}

推荐阅读