【发布时间】:2017-01-20 21:36:31
【问题描述】:
我在这里有一个很长的函数,它会进行一堆 API 调用,解析数据并返回两个数组,代表一堆观光地点(一个数组保存纬度,一个保存纬度)。我遇到的问题是确定两个数组何时完成填充。理想情况下,我希望能够放置
print("ArrayCount = \(self.latArray.count)")
在我的代码中的某处,并在控制台中接收到一条打印语句,读取 ArrayCount = 123。但是,在我放置打印语句的任何地方,我都会得到一个数组计数 0,或者在添加它们时打印出一个循环值 (1 ..2..3.. ... ..123)。提前致谢!
func someFunction()
{
let url:URL = URL(string: "...")
let task = URLSession.shared.dataTask(with: URLRequest(url: url))
{
data, response, error in
if error != nil
{
print("ERROR IN API REQUEST: \(error!.localizedDescription)")
}
else
{
do
{
if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]
{
if let layerOne = parsedData["one"] as? [String: Any]
{
if let layerTwo = layerOne["two"] as? [[String: Any]]
{
for layerThree in layerTwo
{
if let variableName = layerThree["value"] as? String
{
let innerUrl:URL = URL(string: "...")!
let innerTask = URLSession.shared.dataTask(with: URLRequest(url: innerUrl))
{
data, response, error in
if error != nil
{
print("ERROR IN API REQUEST: \(error!.localizedDescription)")
}
else
{
do
{
if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]
{
if let layerA = parsedData["A"] as? [String: Any]
{
if let lat = layerA["Latitude"] as? String, let long = layerA["Longitude"] as? String
{
self.latArray.append(lat)
self.longArray.append(lon)
}
}
}
}
catch
{
print("ERROR IN JSON SERIALIZATION")
}
}
}
innerTask.resume()
}
}
}
}
}
}
catch
{
print("ERROR IN JSON SERIALIZATION")
}
}
}
task.resume()
}
【问题讨论】:
-
你能提供一个你收到的 JSON 样本吗?你解析这个 JSON 的方式看起来很奇怪。
-
您是否通过并替换所有变量和下标来使用随机的任意名称?这看起来有点像您正在尝试解析来自 Google Places API 的 API 响应。为什么不直接发布您的原始代码?这样,其他人就可以更轻松地帮助您解决问题。
-
您可以为每个
if语句执行多个条件绑定。你不需要所有这些疯狂的嵌套。