我快速新手,我正在使用Swift Mac App作为演示项目。该应用程序将股票代码存储在sqlite表中,获取股票价格,计算价值,然后最终显示结果在表格视图中。 我在寻找数据来填充表视图时,正在寻找提高执行速度的方法。所以我使用了Dispatch Queue,如下所示。问题是, 股票价格和股票价值列(在异步闭包中计算)始终为空。我究竟做错了什么?函数getStocksData返回一个NSMutableArray,它是我的表视图的数据源
func getStocksData() -> NSMutableArray {
sharedInstance.database!.open()
let resultSet: FMResultSet! = sharedInstance.database!.executeQuery("select stock_id,symbol,company,qty from stocks ", withArgumentsIn: [])
let stocksDBRowsArray : NSMutableArray = NSMutableArray()
if (resultSet != nil) {
while resultSet.next() {
let stockInfo : StockInfo = StockInfo()
stockInfo.StockID = resultSet.string(forColumn: "stock_id")!
stockInfo.Symbol = resultSet.string(forColumn: "symbol")!
stockInfo.StockCompany = resultSet.string(forColumn: "company")!
stockInfo.Qty = resultSet.string(forColumn: "qty")!
//create queue with unique label to fetch stock price
let queue=DispatchQueue(label:stockInfo.Symbol)
queue.async {
//code to fetch stock price goes here
.....
stockInfo.StockPrice=stockPrice
stockInfo.StockValue=stockPrice*stockInfo.Qty
}
stocksDBRowsArray.add(stockInfo)
}
}
sharedInstance.database!.close()
return stocksDBRowsArray
}
答案 0 :(得分:0)
我做错了什么?
当您的getStocksData()方法返回时,StockInfo值可能会或可能尚未填充获取的值。 StockInfo值最终在 undefined 应用程序线程的未定义时间点填充。
提供的代码段的作用。当然这不是你想要的,但你想要的也不是很清楚。
Swift的Dispatch库的文档非常简洁,并且不会帮助您更好地理解正在发生的事情。我建议您研究dispatch_async
的文档,它是Swift DispatchQueue.async
的C等价物。它记录了更多细节,您将阅读这个关键句子:
对该函数的调用总是在提交块后立即返回,并且永远不会等待调用该块。
在缺少Swift文档时,通常不要犹豫切换到Objective-C文档。掌握一些Swift技术有时需要一点点不便。你会在那里学到很多信息。