我是一个敏捷的新手,正在开发一个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
}
最佳答案
我究竟做错了什么?
当您的getStocksData()方法返回时,StockInfo值可能已填充,也可能尚未填充。 StockInfo值最终会在某个未定义的时间点填充到未定义的应用程序线程中。
这就是所提供的代码段的作用。当然这不是您想要的,但是您想要的也不是很清楚。
Swift的Dispatch库的文档非常简洁,不会帮助您了解正在发生的事情。相反,我建议您研究dispatch_async
的文档,它与Swift DispatchQueue.async
的C等效。其中记录了更多详细信息,您将阅读以下关键句子:
提交该块后,始终会立即返回对该函数的调用,并且永远不要等待该块被调用。
通常,在缺少Swift文档时,不要犹豫切换到Objective-C文档。掌握一些Swift技术有时会带来一些不便。您将在那里学习大量信息。
关于swift - Swift Mac App:使用调度队列加快执行速度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46751719/