代码之家  ›  专栏  ›  技术社区  ›  JamMan9

如何在swift中循环通过Alamorefire数据响应?

  •  0
  • JamMan9  · 技术社区  · 6 年前

    在我的项目中,我第一次尝试使用Alamoire。不过,我有点困惑,如何循环访问我的数据响应,并将结果存储在一个数组中。

    我有一个数据模型来捕获包含2个属性(名称、描述)的数据。

    import Foundation
    
    class categoryModel {
        var name: String?
        var description: String?
    
        init(name: String?, description: String?) {
            self.name = name
            self.description = description
        } 
    }
    

    然后我有一个TableViewController,它创建一个CategoryModel类型的数组。在我的视图中,我加载然后调用我的API并捕获一些数据。这是我正在努力的部分。我想将响应值存储在数组中。

    var categories = [categoryModel]()
    
    override func viewDidLoad() {
    
    Alamofire.request("http://my.custom.api.url", encoding: JSONEncoding.default)
            .responseJSON { response in
                //print(response)
    
                if let json = response.result.value {
    
                }
    
    
        }
    }
    

    我已打印响应对象并获得以下信息:

    SUCCESS: (
        {
            "category_number" = 4;
            description = "";
            name = "Traditional Curries";
        },
        {
            "category_number" = 3;
            description = "Traditional starters";
            name = Starters;
        }
    )
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Sunil Chauhan    6 年前

    请参阅Alamoire文档 here . 正如它所暗示的,

    var categories = [categoryModel]()
    
    Alamofire.request("http://my.custom.api.url", encoding: JSONEncoding.default)
        .responseJSON { response in
         if let json = response.result.value as? [[String: AnyObject]] {
             categories = json.compactMap({ return categoryModel(name: $0["name"], description: $0["description"]) })
         }
    }
    

    另外,我建议使用 CategoryModel 而不是 categoryModel 也就是说,类名的camelcase。

        2
  •  0
  •   Fangming    6 年前

    您的JSON对象有多个错误,我假设您有一个键名为“arr”的顶级JSON数组。在数组中,每个对象都有三个键。所以你要写:

    let topLvlArray = json["arr"] as! [Any]
    
    for obj in topLvlArray as! [String:Any] {
        let category = obj.category_number
        let description = obj.description 
        let name = obj.name
        //construct your categoryModel object
    }
    
        3
  •  0
  •   iShox    6 年前

    首先,为GET JSON数据编写一个函数

      override func viewDidLoad() {
          getJsonData()
    }
    var categories = [categoryModel]()
    
    func getJsonData(){
    Alamofire.request("http://my.custom.api.url", encoding: JSONEncoding.default)
            .responseJSON { response in
                //print(response)
    
                if let json = response.result.value {
                 let name = json["name"].stringvalue
                 let description = json["description"].stringvalue
                 let dataAll = categoryModel(name: name!, description: description!)
                 categories.append(dataAll)
                 print(categories.count)
    
                }
    
    
        }
    }