Swift Mac App:使用调度队列

时间:2017-10-15 04:32:59

标签: swift macos sqlite dispatch-async

我快速新手,我正在使用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
    }

1 个答案:

答案 0 :(得分:0)

  

我做错了什么?

当您的getStocksData()方法返回时,StockInfo值可能会或可能尚未填充获取的值。 StockInfo值最终 undefined 应用程序线程的未定义时间点填充。

提供的代码段的作用。当然这不是你想要的,但你想要的也不是很清楚。

Swift的Dispatch库的文档非常简洁,并且不会帮助您更好地理解正在发生的事情。我建议您研究dispatch_async的文档,它是Swift DispatchQueue.async的C等价物。它记录了更多细节,您将阅读这个关键句子:

  

对该函数的调用总是在提交块后立即返回,并且永远不会等待调用该块。

在缺少Swift文档时,通常不要犹豫切换到Objective-C文档。掌握一些Swift技术有时需要一点点不便。你会在那里学到很多信息。