2017-10-15 79 views
0

我是一个快速的新手,我正在一个Swift Mac应用程序作为演示项目。应用程序将股票代码存储在sqlite表中,获取股票价格,计算值,然后最终在表格视图中显示结果。 我正在寻找提高执行速度时提取数据填充我的表视图。所以我使用了Dispatch Queue,如下所示。问题在于股票价格和股票价格列(在异步收盘时计算)总是空的。我究竟做错了什么?该功能getStocksData返回NSMutableArray的是数据源为我的表视图Swift Mac App:加快执行与调度队列

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

我到底做错了什么?

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

这就是提供的代码片断所做的。当然这不是你想要的,但是你想要的也不是很清楚。

Swift的Dispatch库的文档非常简洁,并且不会帮助您很好地理解正在发生的事情。相反,我建议您研究dispatch_async的文档,它是Swift DispatchQueue.async的C等效文档。据记载有更多的细节,你会读这个关键句:

调用该函数总是立即返回块提交后不要等要调用的块。

当Swift文档缺失时,通常不要犹豫切换到Objective-C文档。掌握一些Swift技术有时需要这种小小的不便。你会在那里了解到大量的信息。

+0

BTW,FMDatabase在多线程环境中使用是危险的。您应该改用FMDatabaseQueue。 –