@uzolenta

Изменение переменной в функции URLSession SWIFT?

Здравствуйте! Помогите, спасите! Недавно изучаю свифт. Хочу запрос данных с сервера перенести в отдельный класс в виде функции. Перед тем, как задать вопрос здесь, я попробовал много разных вариантов, но userInfo так и не меняется в блоке do {
userInfo["firstName"]= responseApi.user[0].first_name
userInfo["lastName"] = responseApi.user[0].last_name
}
Пожалуйста, подскажите, как правильно сделать, если это реально вообще.
var userInfo = [String:String?]
func getInfoUser (id_users: String) -> [String: String?] {
     
    /*GET INFO USER*/
        guard let url = URL(string: Shared.apiUrl + "users/user.php") else { return userInfo}
    
    let postString = "id_users=" + id_users
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = postString.data(using: .utf8)
    
    URLSession.shared.dataTask(with: request) {(data, response, error) in
    guard let data = data else {return}
    
    struct responseApi : Decodable {
    var error: errorApi?
    var response: String?
    var user: [userApi]
    }
    struct errorApi: Decodable {
    var error_code: String
    var error_msg: String
    }
    
    struct userApi: Decodable {
    //var : String
    }
    
    do {
    
    let responseApi = try JSONDecoder().decode(responseApi.self, from: data)
    
    /*CHECK API ERRORS*/
    if responseApi.error != nil{
    let error = responseApi.error?.error_code
    let error_msg = FuncClass().iserror(error_code: error!)
    }
    /*END CHECK API ERRORS*/
        
        userInfo["firstName"]= responseApi.user[0].first_name
        userInfo["lastName"] = responseApi.user[0].last_name
    }
        
    catch let error {
    print("ERROR CATCH")
        print(error)
    return
    }

    }.resume()
    /*END GET INFO USER*/
        
        
        return userInfo
        
        
    }
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Sandboxser
Попробуйте использовать Alamofire + SwiftyJSON
Alamofire.request("").responseJSON(completionHandler: { response in
            if ((response.result.value) != nil) {
                let swifts = JSON(response.result.value!)
             if let resData = swifts.arrayObject{
                  self.dataTable = resData as! [[String:AnyObject]]
         
                }
            }

Примерно по памяти написал код , SJ сможете преобразовать как вам удобней, и можете глянуть для Decodable
Ответ написан
@dotAramis
Тут такая история... URLSession.shared.dataTask...resume() - асинхронный вызов, он выполняется после выхода из getInfoUser: (это еще мы не коснулись структур, что copy). Вам нужно сделать примерно так:
func getInfoUser (id_users: String, completion: @escaping (([String: String?])->())) {


а далее:
var userInfo: [String:String?] = [:]
userInfo["firstName"]= responseApi.user[0].first_name
userInfo["lastName"] = responseApi.user[0].last_name
comepletion(userInfo)


вызов:
getInfoUser(id_users: "", completion: {
~code here~
})

идея такая, писал без ide, так что примерно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы