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

use*_*030 -2 sql asynchronous swift

我找到了一个用于连接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>
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

传递的块由库异步执行.有没有办法让代码同步执行,这样每当我调用时execute,该线程在execute返回之前等待库工作完成?

nhg*_*rif 11

所以,我对你正在使用的github库有一些经验.

由于该库存在一些问题,您可能希望同步进行此调用(您不能同时进行多个查询,并且无法打开与服务器的多个连接,因为该库会执行所有操作SQL通过单例工作).为了解决其中的一些问题,我强烈建议您查看我写的SQLConnect库(花了一些时间尝试使用您正在使用的Martin库).我的库远离单例方法,您可以根据需要在尽可能多的不同线程上建立多个连接.

有了这个......你可以让这个库(以及我的同时)同步执行.

如果您在SQLClient.h文件中注意到,该SQLClient对象指定a workerQueue和a callbackQueue.Martin已将其设置callbackQueue为首先实例化单例的任何队列,并且workerQueue是他指定的队列.但是,这些都是可以完美设置的公共财产.

如果您确实希望查询同步执行,只需设置workerQueuecallbackQueue操作当前队列即可.

SQLClient.sharedInstance.workerQueue = NSOperationQueue.currentQueue()
SQLClient.sharedInstance.callbackQueue = NSOperationQueue.currentQueue()
Run Code Online (Sandbox Code Playgroud)

然后执行您的查询.

所有代码都将在同一个代码上执行NSOperationQueue,因此将同步执行.

当然,你可以用做同样的事情,我的SQLConnect库,为SQLConnection对象同样指定workerQueuecallbackQueue,您可以指定任何你想要的队列.

随着所有的此说,我非常,非常,强烈建议您让操作保持同步,并想出什么问题让你觉得它应该是同步进行一些其他的解决办法.即使你仍然认为它应该是同步的,请确保它不会阻止UI线程.