Objective C异步到同步数据库访问

时间:2015-06-12 13:02:15

标签: sql swift asynchronous

我找到了一个用于连接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返回之前等待库工作完成?

1 个答案:

答案 0 :(得分: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,您可以为所需的任何队列指定。{ / p>

对于所有,我强烈,高度,强烈建议您允许操作保持异步,并为您认为应该同步执行的任何问题提出一些其他解决方案。即使您仍然认为它应该是同步的,请确保它不会阻止UI线程。