2015-06-12 110 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线程。