как сохранить ответ сервиса в модели с alamofire - PullRequest
0 голосов
/ 06 мая 2019

Я учусь программировать быстро, я разработал с Android ранее потребление услуг и сохранил их в модели с помощью дооснащения и сериализации. Теперь в Swift я использую Alamofire 4.0 и SwiftyJson для использования сервиса, и проблема заключается в том, как сохранить все ответы JSON в модели, а затем использовать эти данные. Я рассмотрел несколько примеров, но до сих пор не понимаю, как это сделать. , Не могли бы вы сказать мне, как это сделать или что мне нужно добавить, чтобы выполнить это действие, чтобы получить информацию, а затем использовать ее? поэтому я потребляю услугу

static func loginService(email : String, password : String, completionHandler : @escaping (LoginResponse) -> Void){
        let parameters : Parameters  = ["email": email, "password": password]
        Alamofire.request(AlamofireConstants.LOGIN, method: .post, parameters: parameters, encoding: URLEncoding.default).validate(statusCode: 200..<300).responseData { response in
            switch response.result {
            case .failure(let error):
                print("error ==> \(error)")
            case .success(let data):
                do{
                    let result = try JSONDecoder().decode(LoginResponse.self, from: data)
                    print(result)
                } catch {
                    print(error)
                }
            }
        }
    }

это моя модель

    struct LoginResponse : Decodable {
    let user : User?
    let status: Int
    let success: Bool
    let message: String
}

struct User : Decodable {
    let id: Int
    let firstName, lastName, surName, email: String
    let emailToken: String?
    let validate: String
    let token, nationality, documentType, documentNumber: String?
    let legalName, legalNumber, birthdate: String?
    let gender: String
    let phoneMovil, phoneFix, icon: String?
    let wishOffers, acceptTerms, isCustomer: Int
    let active: Bool
    let createdAt, updatedAt: String
}

и это JSON из ответа

  {
"user": {
    "id": 183,
    "first_name": "teste",
    "last_name": "testet",
    "sur_name": "este",
    "email": "adeveloper964@gmail.com",
    "email_token": null,
    "validate": "S",
    "token": null,
    "nationality": null,
    "document_type": null,
    "document_number": null,
    "legal_name": null,
    "legal_number": null,
    "birthdate": null,
    "gender": "O",
    "phone_movil": null,
    "phone_fix": null,
    "icon": null,
    "wish_offers": 0,
    "accept_terms": 1,
    "is_customer": 0,
    "active": true,
    "created_at": "2019-05-13 17:04:50",
    "updated_at": "2019-05-14 10:19:31"
},
"status": 0,
"success": true,
"message": ""

}

Я получаю эту ошибку

keyNotFound (CodingKeys (stringValue: "firstName", intValue: nil), Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue: "user", intValue: nil)], debugDescription: "Нет значения, связанного с ключом CodingKe (stringValue: \ "firstName \", intValue: nil) (\ "firstName \"). ", underError: nil))

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Почему SwiftyJSON? Тебе это не нужно. Разобрать JSON в модель Decodable гораздо проще в использовании и она встроена (без зависимостей).

struct LoginResponse : Decodable {

    let user: User
    let status: Int
    let success : Bool
    let message : String
}

struct User : Decodable {
    let id : Int
    let firstName, lastName, surName, email : String
}


static func loginService(user : String, password : String){
    Alamofire.request(AlamofireConstants.BASE_URL_TEST + "/api/loginuser", method: .post, parameters: ["email":user,"password":password], encoding: URLEncoding.default)
        .validate(statusCode: 200..<300)
        .responseData { response in // note the change to responseData
            switch response.result {
            case .failure(let error):
                print(error)
            case .success(let data):
                do {
                    let decoder = JSONDecoder()
                    decoder.keyDecodingStrategy = .convertFromSnakeCase
                    let result = try decoder.decode(LoginResponse.self, from: data)
                    print(result)
                } catch { print(error) }
            }
    }
}
0 голосов
/ 11 мая 2019

import SwiftyJSON в классе, где вы написали loginService API, и в случае успеха напишите:

case .success(let value):
  let json = JSON(value)
  let loginModel = LoginResponse(json: json)
  print("Login Model is: \(loginModel)")

и посмотрите, работает ли он

...