【问题标题】:Alamofire : Updating array's values with JSON's dataAlamofire:使用 JSON 数据更新数组的值
【发布时间】: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 的新手,我不知道该怎么做!谢谢。

标签: arrays json swift alamofire


【解决方案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
  • 哈,哎呀,你是对的。我错过了最重要的部分,调用完成闭包!查看编辑。
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2023-04-05
  • 2017-01-15
  • 2017-12-21
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多