如何在swift 3.0中通过url异步获取多个JSON数据

如何在swift 3.0中通过url异步获取多个JSON数据,json,swift,swift3,Json,Swift,Swift3,在这里,我试图获得过去30个日期的卢比货币值 我正在使用Alamofire获取印度卢比货币的最后30个日期值 //strDates contains all 30 days dates for i in 0..<strDates.count { Alamofire.request("http://api.fixer.io/\(strDates[i])?base=USD").responseJSON { response in if

在这里,我试图获得过去30个日期的卢比货币值

我正在使用Alamofire获取印度卢比货币的最后30个日期值

//strDates contains all 30 days dates

for i in 0..<strDates.count {
    Alamofire.request("http://api.fixer.io/\(strDates[i])?base=USD").responseJSON { response in               
         if let arr = response.result.value as? [String:AnyObject]
         {
             let inrc = (arr["rates"]?["INR"] as? Double)!
             print(inrc)
             self.sValues.append(inc)
             print(sValues)
             //It prints values here.
         }
    }
}
print(sValues) //Print nil

setChart(dataPoints: strDates, values: sValues)
//标准日期包含所有30天的日期

对于0..中的i,您的代码会导致打印
nil
,因为您的
print(sValues)
在请求响应之前运行。这个街区

if let arr = response.result.value as? [String:AnyObject]
{
    let inrc = (arr["rates"]?["INR"] as? Double)!
    print(inrc)
    self.sValues.append(inc)
    print(sValues)
    //It prints values here.
}
仅当请求返回值或错误时运行。因此,您请求中的任何值的使用也应该在这里完成。如果要使用该值更新某些UI元素或数据库,还应在此块中调用该方法,以确保已从其源检索到该值


我建议您在编写任何异步代码时采用这种思维方式,因为当您的代码运行在另一个线程或服务器上时,您永远不会期望返回。运行只在异步代码完成时运行的完成块中需要返回值的方法总是比较安全的。

如果要在表中显示它们,请创建Array类型的强变量或其他数据提供程序(例如CoreData、SQLite)并将结果存储在那里。在AF的完成块中,将数组变量的值(或更新本地数据提供程序)设置为API结果数据,然后在表上调用
reloadData()
。您还需要配置UITableView委托和数据源方法。

是否仅在完成所有调用时才查找要刷新的图表?如果是这样,您可以使用如下模式:

    var completedCalls = 0
    for i in 0..<strDates.count {
        Alamofire.request("http://api.fixer.io/\(strDates[i])?base=USD").responseJSON { response in
            if let arr = response.result.value as? [String:AnyObject]
            {
                completedCalls += 1
                let inrc = (arr["rates"]?["INR"] as? Double)!
                print(inrc)
                self.sValues.append(inc)
                print(sValues)
                //It prints values here.
                if completedCalls = strDates.count {
                    DispatchQueue.main {
                        setChart(dataPoints: strDates, values: sValues)
                    }
                }
            }
        }
    }
var completedCalls=0

对于0中的i..否,我想将此数组作为参数传递给条形图。然后您需要在AF请求的完成块中重新绘制条形图。您需要共享如何组合图表方法的代码。他们是否有更新/绘制的委托方法?如何告诉图表使用哪些数据?我正在使用danielgindi/Charts Library。您需要共享代码。如果我们在黑暗中的干草堆里找针,我们帮不了你。你好@Josh,面临新问题。每当我打开“导航到另一个视图”并返回“图表视图”后,条形图都会刷新并显示不同的值。每当我导航或刷新条形图时,条形图都会刷新并显示不同的值。值得一提的是,您最好使用调度队列来处理需要等待完成的后续请求。查找
dispatch\u group\u async
dispatch\u group\u notify
并签出。
    var completedCalls = 0
    for i in 0..<strDates.count {
        Alamofire.request("http://api.fixer.io/\(strDates[i])?base=USD").responseJSON { response in
            if let arr = response.result.value as? [String:AnyObject]
            {
                completedCalls += 1
                let inrc = (arr["rates"]?["INR"] as? Double)!
                print(inrc)
                self.sValues.append(inc)
                print(sValues)
                //It prints values here.
                if completedCalls = strDates.count {
                    DispatchQueue.main {
                        setChart(dataPoints: strDates, values: sValues)
                    }
                }
            }
        }
    }