【发布时间】:2017-01-24 18:00:38
【问题描述】:
我正在使用 Alamofire 和 SwiftyJSON 从 YQL 获取股票,将它们保存到我的核心数据“公司”对象,然后使用标签中的数据,如下所示:
尝试的代码:
func fetchStocks() {
let entity = NSEntityDescription.entity(forEntityName: "Company", in: managedContext)!
var prices = [String]()
if let data = try? Data(contentsOf: URL(string: "https://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20Ask%2C%20YearHigh%2C%20YearLow%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22%2C%22GOOG%22%2C%22TWTR%22%2C%22TSLA%22%2C%20%22FB%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")!) {
let json = JSON(data: data)
print(json)
if let appleStockPrice = json["query"]["results"]["quote"][0]["Ask"].string {
prices.append(appleStockPrice)
}
if let googleStockPrice = json["query"]["results"]["quote"][1]["Ask"].string {
prices.append(googleStockPrice)
}
if let twitterStockPrice = json["query"]["results"]["quote"][2]["Ask"].string {
prices.append(twitterStockPrice)
}
if let teslaStockPrice = json["query"]["results"]["quote"][3]["Ask"].string {
prices.append(teslaStockPrice)
}
if let facebookStockPrice = json["query"]["results"]["quote"][4]["Ask"].string {
prices.append(facebookStockPrice)
}
for stocks in prices {
let company = NSManagedObject(entity: entity,insertInto: managedContext)
company.setValue(stocks, forKey: "stockPrice")
companies.append(company)
}
do {
try managedContext.save()
vc.tableView.reloadData()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
当我尝试将价格设置为详细的文本标签时
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! Cell
let company = companies[indexPath.row]
cell.textLabel?.text = company.value(forKey: "name") as? String
cell.detailTextLabel?.text = "Current stock price: \(company.value(forKey: "stockPrice") as? String)"
return cell
}
我明白了:
因此,股票价格被获取,但没有被放入公司的单元格中 - 相反,这些值为零,股票价格进入单独的单元格。
为什么会发生这种情况,我该如何解决?
编辑:发布整个 cellForRow 方法,这里是 YQL JSON:
{
"query" : {
"created" : "2017-01-24T18:12:06Z",
"results" : {
"quote" : [
{
"symbol" : "AAPL",
"YearLow" : "89.470",
"YearHigh" : "120.810",
"Ask" : "119.990"
},
{
"symbol" : "GOOG",
"YearLow" : "663.06",
"YearHigh" : "824.87",
"Ask" : "821.70"
},
{
"symbol" : "TWTR",
"YearLow" : "13.73",
"YearHigh" : "25.25",
"Ask" : null
},
{
"symbol" : "TSLA",
"YearLow" : "141.0500",
"YearHigh" : "269.3400",
"Ask" : "253.4100"
},
{
"symbol" : "FB",
"YearLow" : "94.23",
"YearHigh" : "133.50",
"Ask" : "128.67"
}
]
},
"count" : 5,
"lang" : "en-us"
}
}
编辑 2:设置名称、徽标和 stockPrices
func setDefaultCompanies() {
// Default 5 companies at launch - user can delete/add/edit
let userDefaults = UserDefaults.standard
let defaultValues = ["firstRun" : true]
userDefaults.register(defaults: defaultValues)
if userDefaults.bool(forKey: "firstRun") {
let entity = NSEntityDescription.entity(forEntityName: "Company", in: managedContext)!
let defaultCompanies = ["Apple", "Google", "Facebook", "Tesla", "Twitter"]
for companyName in defaultCompanies {
let company = NSManagedObject(entity: entity,insertInto: managedContext)
company.setValue(companyName, forKey: "name")
company.setValue(companyName, forKey: "logo")
companies.append(company)
}
fetchStocks()
do {
try managedContext.save()
userDefaults.set(false, forKey: "firstRun")
vc.tableView.reloadData()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
【问题讨论】:
-
您需要向我们展示
cellForRowAtindexPath的完整代码。 -
粘贴整个 cellForRow 方法。示例 json 也会有所帮助
-
我编辑添加了 cellForRow 和 JSON(Alistra,我认为您要求的是从 YQL 请求返回的 JSON,如果您的意思不同,请告诉我)
-
您仅使用引号创建
NSManagedObject实例。名称分配在哪里? -
@vadian 几天前你实际上帮我取了名字,我将在这里编辑我的问题以显示代码(那里也调用了 fetchStocks 函数)
标签: ios swift uitableview core-data