我找到了一个用于连接Microsoft SQL Server数据库的开源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 :(得分:11)
所以,我对你正在使用的github库有一些经验。
由于此库存在一些问题,您可能希望同步进行此调用(您不能同时进行多个查询,并且无法打开与服务器的多个连接,因为该库会执行此操作它的所有SQL都通过单例工作)。要解决其中一些问题,我强烈建议您查看我写的SQLConnect library(花了一些时间尝试使用您正在使用的Martin的库)。我的库远离单例方法,您可以根据需要在尽可能多的不同线程上建立多个连接。
据说...你可以使这个库(以及我的)同步执行。
如果您在SQLClient.h
file中注意到,SQLClient
对象指定了workerQueue
和callbackQueue
。 Martin已将callbackQueue
设置为首先实例化单例的任何队列,而workerQueue
是他指定的队列。但是,这些都是可以完美设置的公共属性。
如果确实希望查询同步执行,只需设置workerQueue
和callbackQueue
即可对当前队列进行操作。
SQLClient.sharedInstance.workerQueue = NSOperationQueue.currentQueue()
SQLClient.sharedInstance.callbackQueue = NSOperationQueue.currentQueue()
然后执行查询。
所有代码都将在同一NSOperationQueue
上执行,因此将同步执行。
当然,您可以使用my SQLConnect library执行相同操作,因为the SQLConnection
object类似地指定了workerQueue
和callbackQueue
,您可以为所需的任何队列指定。{ / p>
对于所有,我强烈,高度,强烈建议您允许操作保持异步,并为您认为应该同步执行的任何问题提出一些其他解决方案。即使您仍然认为它应该是同步的,请确保它不会阻止UI线程。