2015-06-12 49 views
-2

我發現了一個用於連接到Microsoft SQL Server數據庫的開放源代碼Objective-C庫。Objective C異步到同步數據庫訪問

問題是,我想同步使用它。

這是我的Swift項目如何使用庫。

func execute(query: String) { 

    self.client.connect(host + ":" + port, username: username, password: password, database: database) { (connected) -> Void in 
     if connected { 
      self.client.execute(query, completion: { (results: Array<AnyObject>!) -> Void in 
       self.result = results[0] as! Array<AnyObject> 
      }) 
     } 
    } 
} 

傳遞的塊由庫異步執行。有沒有辦法使代碼同步執行,以便每當我呼叫execute時,那個線程在execute返回之前等待庫工作完成?

+0

我連接到外部微軟sql服務器 – user3623030

+0

你的目標是什麼? Objective-C或Swift? –

+0

你正在使用什麼樣的MSSQL庫? –

回答

11

所以,我有一些使用github庫的經驗。

由於該庫存在一些問題,您可能想同步進行此調用(您無法一次創建多個查詢,也無法打開到服務器的多個連接,因爲該庫通過單例完成所有的SQL工作)。爲了解決這些問題,我強烈建議您查看我編寫的SQLConnect library(花了一些時間嘗試使用您正在使用的Martin的庫)。我的庫離開了單例方法,您可以根據需要在任意多個不同的線程上創建儘可能多的連接。

說了這麼...你可以使這個庫(和我的以及)同步執行。

如果您在SQLClient.h file中發現,SQLClient對象指定workerQueuecallbackQueue。 Martin已將callbackQueue設置爲單例首次實例化的任何隊列,而workerQueue是他指定的隊列。但是,這些都是公共財產,可以設置得很好。

如果你真的查詢同步執行,只需設置workerQueuecallbackQueue對當前隊列操作。

SQLClient.sharedInstance.workerQueue = NSOperationQueue.currentQueue() 
SQLClient.sharedInstance.callbackQueue = NSOperationQueue.currentQueue() 

然後執行您的查詢。

所有的代碼將在相同的NSOperationQueue上執行,因此,將通過同步。

當然,你也可以做到使用my SQLConnect library同樣的事情,因爲the SQLConnection object同樣規定了workerQueuecallbackQueue,你可以指定你想要的任何隊列。

隨着所有這說,我高度,高度,強烈建議您允許操作保持異步,並提出一些其他解決方案,以使您認爲它應該是同步執行的任何問題。即使你仍然認爲它應該同步,請確保它不會阻塞UI線程。