ios - YQL 请求显示的股票价格不正确(Swift)

标签 ios swift

我有一个函数可以从 YQL 获取当前股票价格(使用 Alamofire):

func stockFetcher(completion: @escaping ([String]?) -> Void) {
Alamofire.request(stockUrl).responseJSON { (responseData) -> Void in
    if((responseData.result.value) != nil) {
        let json = JSON(responseData.result.value!)
        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 samsungStockPrice = json["query"]["results"]["quote"][4]["Ask"].string {
            prices.append(samsungStockPrice)
        }
        completion(prices)
        print(json)
    }
}
}

这是返回的 JSON,除了 Twitter 的 null 之外,一切看起来都很好,但这是一个单独的问题:

{
"query" : {
"created" : "2017-01-11T16:34:51Z",
"results" : {
  "quote" : [
    {
      "symbol" : "AAPL",
      "YearLow" : "89.4700",
      "YearHigh" : "119.3600",
      "Ask" : "119.1100"
    },
    {
      "symbol" : "GOOG",
      "YearLow" : "663.06",
      "YearHigh" : "816.68",
      "Ask" : "805.08"
    },
    {
      "symbol" : "TWTR",
      "YearLow" : "13.730",
      "YearHigh" : "25.250",
      "Ask" : null
    },
    {
      "symbol" : "TSLA",
      "YearLow" : "141.0500",
      "YearHigh" : "269.3400",
      "Ask" : "227.8600"
    },
    {
      "symbol" : "SSNLF",
      "YearLow" : "1000.00",
      "YearHigh" : "1600.00",
      "Ask" : null
    }
  ]
},
"count" : 5,
"lang" : "en;q=1.0"
  }
}

在我的表格 View 中,我像这样显示价格(在 cellForRow 中):

    stockFetcher(completion: {
        (prices) -> Void in

        if (prices?.count)! > indexPath.row + 1 {
            cell.detailTextLabel?.text = "Current Stock Price: \(prices![indexPath.row])"
        } else {
            cell.detailTextLabel?.text = "No data found"
        }
    })

前 3 个价格显示的是正确的价格,但 Tesla 显示的是 Apple 的当前价格(在本例中为 119),而 Samsung 显示的是 Google 的价格(在本例中为 804) - 似乎显示了前 3 个价格然后开始重复。

谁能看出问题出在哪里吗?

编辑:cellForRow

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! CompanyCell

    // Labels
    cell.textLabel?.text = companyNames[indexPath.row]

    // Detail labels
    stockFetcher(completion: {
        (prices) -> Void in

        if (prices?.count)! > indexPath.row + 1 {
            cell.detailTextLabel?.text = "Current Stock Price: \(prices![indexPath.row])"
        } else {
            cell.detailTextLabel?.text = "No data found"
        }
    })

    return cell
}

最佳答案

您的 StockFetcher 会异步执行某些操作(带有完成 block 的网络请求),而完成 block 保留对可重复使用的单元格的引用。

当 Alamofire 返回数据时,该单元格可能正在其他地方使用。您不应该保留单元格引用并执行异步操作。相反,您应该在 TableView 数据源方法之外异步获取数据,然后在触发 cellForRowAt 时,只需从存储的数据中读取数据。

关于ios - YQL 请求显示的股票价格不正确(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41596299/

相关文章:

objective-c - 如何使用图像创建自定义的分组 UITableView

ios - Firebase-iOS 存储错误代码 -13000 : Cannot finalise upload

ios - 通过 IOS Google Drive SDK 列出 Google Drive 中指定文件夹中的所有文件

ios - 在设备中查找路径时出错

ios - 等待上传

html - 如何将图像添加到 <p> 并在 UIWebView 中使用?

json - 在Mac Catalyst中运行的iOS应用程序中的DropInteraction中接收JSON文件

swift - 如何使用弹出按钮切换tableview(swift,cocoa)的内容?

SwiftUI 居中对齐 View ,除非另一个 View "pushes"将其向上

ios - SWRevealViewController 中不存在后退按钮