我无法使用本质上下载JSON数据并解析它的代码,以返回returnInfo。当我打印信息它是完整的但是当它返回时,返回结构默认值。不确定我做错了什么帮助会受到高度赞赏!
如果您需要任何其他信息,请告诉我,我很乐意提供。
import Foundation
struct stockData {
var name: String = ""
var askPrice: String = ""
var percentageChange: String = ""
}
class stockinfo {
init () {
}
func getInfo (stock: String) -> stockData{
let stockSymbol = stock // Sets stock symbol
var returnInfo = stockData()
// Configuration for request and starts the connection
let requestURL: NSURL = NSURL(string: "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22" + stockSymbol + "%22)&env=store://datatables.org/alltableswithkeys&format=json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("JSON File Downloaded Successfully")
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
// Parses out the JSON Query into data to be assigned to a variable and returned
let query: NSDictionary = json["query"] as! NSDictionary
let results: NSDictionary = query["results"] as! NSDictionary
let quote: NSDictionary = results["quote"] as! NSDictionary
let companyName: String = quote["Name"] as! String
let askPrice: String = quote["Ask"] as! String
let percentageChange: String = quote["ChangeinPercent"] as! String
// Places JSON data into return struct
print(companyName)
print(askPrice)
print(percentageChange)
returnInfo.name = companyName
returnInfo.askPrice = askPrice
returnInfo.percentageChange = percentageChange
} catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
return returnInfo
}
}
答案 0 :(得分:1)
您需要一个完成处理程序来等待async
调用dataTaskWithRequest
完成。修改您的代码,如:
func getInfo (stock: String, completion: (cName: String, price: String, percentChange: String) -> ()) -> stockData{
//your code
let companyName: String = quote["Name"] as! String
let askPrice: String = quote["Ask"] as! String
let percentageChange: String = quote["ChangeinPercent"] as! String
// Places JSON data into return struct
print(companyName)
print(askPrice)
print(percentageChange)
completion(cName: companyName, price: askPrice, percentChange: percentageChange)
}
//your code
然后,无论何时你想打电话,主要是按下按钮后,如果你喜欢viewDidLoad
,请执行此操作:
getInfo("your string") {(name, price, change) in
///use the three values how you want.
}