Alamofire:使用 JSON 数据更新数组的值

Posted

技术标签:

【中文标题】Alamofire:使用 JSON 数据更新数组的值【英文标题】:Alamofire : Updating array's values with JSON's data 【发布时间】:2015-11-14 16:49:29 【问题描述】:

我在尝试使用 JSON 数据更新结构数组时遇到问题。这是我的代码:

结构体是这样定义的: Struct

struct Shot 
    var title: String
    var desc: String
    var img: String

    init(title: String, desc: String, img: String) 
      self.title = title
      self.desc = desc
      self.img = img
    
  

在这里我尝试更新数组,但它不起作用: Code

  func authDribbble() 
    let endURL = "https://api.dribbble.com/v1/shots/"
    let token = "***"
    Alamofire.request(.GET, endURL, parameters: ["access_token" : token])
      .responseJSON  response in
        if let JSON = response.result.value 
          for i in 0..<JSON.count 
            let titleA: String = String(JSON[i]["title"])
            let descA: String = String(JSON[i]["description"])
            let imgA: String = String(JSON[i]["images"])
            self.data += [Shot(title: titleA, desc: descA, img: imgA)]
          
        
    
  

问题是函数执行后,数组保持为空。怎么了? 谢谢。

【问题讨论】:

请在您的问题中包含实际代码,而不是链接到它的图像;链接可能会失效,并且图像不能轻易复制到编辑器中进行测试。 另一个注意事项:您在 Shot 结构中定义的 init 复制了结构类型提供的默认初始化程序。您可以删除它并仍然调用 Shot(title: "", desc: "", img: "") 并且它的工作方式相同。 @geraldWilliam 好的,谢谢 @CalebBrinkman 你是对的。抱歉,我是 Stack Overflow 的新手,我不知道该怎么做!谢谢。 【参考方案1】:

假设您已按如下方式调用此方法:

authDribbble()
print("my data: \(self.data)") // Prints empty array.

问题在于 Alamofire 正在异步执行请求。也就是说,当您的代码进行到下一行(打印语句)时,工作还没有完成。你需要实现一个回调机制。一种方法是将函数作为authDribbble() 函数的参数传递。这会将函数更改为:

  func authDribbble(completion: () -> Void) 
    // create the url
    // create parameters
    Alamofire.request(.GET, url!, parameters: params)
      .responseJSON  response in

        guard let  JSON = response.result.value as? [[String : AnyObject]] else 
          // Wrong type in JSON response. 
          print(response.result.error)
        
        self.data = JSON.map  dict in
          guard let title = dict["title"] as? String,
                     desc = dict["description"] as? String,
                      img = dict["images"] as? String else 
            // Handle error creating Shot from JSON
          
          return Shot(title: title, desc: desc, img: img)
        
        completion()

      
    
  

然后,您将对authDribbble() 的调用替换为:

authDribbble() 
   print("data: \(self.data)") // Prints populated array.

【讨论】:

您已经筋疲力尽了,谢谢。但是有一个问题。我按照你说的更新了代码,但它仍然没有打印任何东西。有什么想法吗? 这里是代码:link 哈,哎呀,你是对的。我错过了最重要的部分,调用完成闭包!查看编辑。

以上是关于Alamofire:使用 JSON 数据更新数组的值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 搜索栏 - 使用 Alamofire 请求更新表格视图

使用 alamofire swift 发布 json 数组

如何使用新的 Swift 3 和 Alamofire 解析 JSON(字典和数组)

使用 Alamofire 和 SwiftyJSON 正确解析具有多个对象的 JSON 数组

如何从 alamofire 中的 json 数组中获取对象?

使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数