从完成语句变量中检索数据时返回空白

Posted

技术标签:

【中文标题】从完成语句变量中检索数据时返回空白【英文标题】:When retrieving data from completion statement variables are returning blank 【发布时间】:2016-07-05 17:00:35 【问题描述】:

我是 ios 编程的新手,在使用完成语句中的变量时遇到了麻烦。我已经包含了下面的代码,我不确定为什么当我将完成变量存储在 dataType 数组中时,它似乎只返回空白字符串。

注意:完成数据在 loadSampleStockData 函数中调用,稍后假设返回到 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 中的单元格

感谢您提供的任何帮助!

import UIKit

class dashboardViewController: DefaultViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var balanceLabel: UILabel!

    var stocks = [stockData]()
    let stock = stockinfo()

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.reloadData()
        loadSampleStockData()
        user.newUser() // Move to login function when login and registration is implemented

        //Sets the Balance Label on Dashboard
        balanceLabel.text = "$" + String(format: "%.2f", user.getBalance())
    

    func loadSampleStockData () 

        var stock1: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
        var stock2: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
        var stock3: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")

        stock.getInfo("FB") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock1 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "FB")
            stocks.append(stock1)
        )
        

        stock.getInfo("MSFT") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock2 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "MSFT")
            stocks.append(stock2)
        )
        

        stock.getInfo("APPL") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock3 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "APPL")
            stocks.append(stock3)
        )
        
        print(stocks.count)
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return stocks.count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cellIdentifier = "stockViewCell"

        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! stockTableViewCell

        let stock = stocks[indexPath.row]

        cell.stockName.text = stock.name
        cell.stockPercentage.text = stock.percentageChange
        cell.stockDollarChange.text = stock.askPrice
        cell.stockTicker.text = stock.stockTicker

        return cell
    

【问题讨论】:

【参考方案1】:

因为stocks += [stock1, stock2, stock3] 发生在您的异步调用将stock1...3 设置为任何值之前。

stocks 的创建应该在完成处理程序中完成。

【讨论】:

感谢您的回复,这可能是一个无知的问题,但如果我在完成处理程序中启动股票,我将无法在另一个完成处理程序中调用它们,因此由于变量范围而无法调用其他函数?我可能会误解你介意提供代码 sn-p 吗?感谢您的帮助 您需要一个共享状态,例如您在此处拥有的实例变量。每个完成处理程序都会异步添加到数组中,主线程会一直等到它们都完成 非常感谢您的耐心等待并花时间帮助我完成这件事。我试图将数据添加到完成处理程序中的“库存”。我将如何将“库存”传递给完成处理程序。我已经在上面进行了更改,我是否要解决这个问题,如果是这样,您介意给我一个代码 sn-p。非常感谢您的帮助,我将继续 google 并阅读文档 你没有传入stocks,闭包会自动“捕获”对它的引用。我真的不能提供任何代码 sn-ps,因为我还没有使用多线程 Swift。您需要在 .append() 指令周围放置一个锁/信号量/互斥锁,以防止出现竞争条件。

以上是关于从完成语句变量中检索数据时返回空白的主要内容,如果未能解决你的问题,请参考以下文章

从firebase获取数据时Recyclerview为空白

在检索 JSON 数据时,让完成块返回 Void 有啥意义?

if 语句在从 firebase 检索数据时未返回正确的元素

带有位域的 PDO 准备好的语句

java 循环变量

在运行 SELECT 语句时,日期列中的空白值返回为 1900/01/01