从完成语句变量中检索数据时返回空白
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()
指令周围放置一个锁/信号量/互斥锁,以防止出现竞争条件。以上是关于从完成语句变量中检索数据时返回空白的主要内容,如果未能解决你的问题,请参考以下文章
在检索 JSON 数据时,让完成块返回 Void 有啥意义?