我是一个敏捷的新手,正在开发一个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/

10-14 16:18
查看更多