Передав значение из Alamofire, получите запрос к переменной - PullRequest
0 голосов
/ 27 марта 2020

Вот мой код, который анализирует данные, но я хочу получить jsonDictionary и назначить его другой переменной для использования внешней области видимости. Я проверил много ответов, но почти все используют print для показа результата, мне нужно получить значение, а не показывать его в консоли. Может кто-нибудь помочь мне, пожалуйста, чтобы решить это

 public func fetchData() {
  let request = Alamofire.request("www.anyurl.com")
   request.responseJSON { data in
    if let json = data.result.value as? [String: Any] {
    guard let jsonArray = json["data"] as? [[String: Any]] else {
          return
    }
    if let jsonDictionary = jsonArray[0]["title"] as? [[String:Any]] {
         print(jsonDictionary)
    }
  }
 }
}

1 Ответ

0 голосов
/ 27 марта 2020

В качестве примера мы получаем этот простой Json Response.

{
  "success": true,
  "Message": "data retrieved successfully",
  "data": {
    "name": "Dilan",
    "age": "26",
    "country": "Sri Lanka"
  }
}

просто вы можете определить переменную publi c где-нибудь в вашем проекте, например

publi c stati c var user: NSDictionary = [:]

Затем вы можете напрямую присвоить свой ответ json в качестве словаря этой переменной и использовать его в своем проекте.

AF.request(URL(string: "someurl")!,
                   method: .get,
                   headers:AppConstants.headers)
            .validate(statusCode:200..<300)
            .validate(contentType:[AppConstants.contentTypeJson])
            .responseJSON { (response) in
                switch response.result{
                case .success(let data):
                    guard let json = data as? [String:AnyObject] else {
                        return
                    }
                    let isSuccess =  (json["success"])?.boolValue ?? false
                    if isSuccess {
                        SomeClass.user = json["data"] as? NSDictionary ?? [:]

                    }else{
                        print("false")
                    }
                case .failure(let error):
                    print("Error")
                }
}

Это еще один способ сделать это с помощью Codable, Decodable

сначала создать Codable Struct

import Foundation

// MARK: - User
struct User: Codable {
    let success: Bool
    let message: String
    let data: DataClass

    enum CodingKeys: String, CodingKey {
        case success
        case message = "Message"
        case data
    }
}

// MARK: - DataClass
struct DataClass: Codable {
    let name, age, country: String
}

, затем вы можете преобразовать свой ответ непосредственно в кодируемый объект

AF.request(URL(string: "someurl")!,
                   method: .get,
                   headers:AppConstants.headers)
            .validate(statusCode:200..<300)
            .validate(contentType:[AppConstants.contentTypeJson])
            .responseJSON { (response) in
                switch response.result{
                case .success(let data):

                        let decoder = JSONDecoder()
                        do {
                            SomeClass.User= try decoder.decode(User.self, from: data)
                            //this time user should be public static var user:User?
                        } catch {
                            print(error.localizedDescription)
                        }
                case .failure(let error):
                    print("Error")
                }
}
...