2015-06-12 2 views
-2

Я нашел библиотеку Objective-C с открытым кодом для подключения к базам данных Microsoft SQL Server.Объектив 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

Я подключаюсь к серверу extern microsoft sql – user3623030

+0

Какую цель? Цель-С или Свифт? –

+0

Какую библиотеку MSSQL вы используете? –

ответ

11

Итак, у меня есть опыт работы с библиотекой github, которую вы используете.

Скорее всего, вы захотите сделать этот вызов синхронно из-за некоторых проблем, которые есть в этой библиотеке (вы не можете сразу делать несколько запросов и не можете открывать несколько подключений к серверу, потому что библиотека все его SQL работает через singleton). Чтобы решить некоторые из этих проблем, я настоятельно рекомендую вам ознакомиться с SQLConnect library, которые я написал (потратив некоторое время на использование библиотеки Мартина, которую вы используете). Моя библиотека отходит от подхода singleton, и вы можете подключить столько подключений, сколько хотите.

С этим сказал ... вы можете сделать эту библиотеку (и мою тоже) выполнять синхронно.

Если вы заметили в SQLClient.h file, объект SQLClient указывает workerQueue и . Мартин установил, что callbackQueue находится в любой очереди, на которой впервые создается экземпляр singleton, а workerQueue - это очередь, которую он задает. Тем не менее, это общедоступные свойства, которые можно настроить отлично.

Если вы действительно хотите запрос выполнить синхронно, просто установите workerQueue и callbackQueue работать на текущей очереди.

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

И затем выполнить ваш запрос.

Весь код будет выполнен на том же NSOperationQueue, и как таковой будет осуществляться синхронно.

Конечно, вы можете сделать то же самое, используя my SQLConnect library как the SQLConnection object аналогично указывает workerQueue и callbackQueue, которые можно указать в любой очереди вы хотите.

все из из этого сказал, что я очень высоко ценю, что вы разрешаете операции оставаться асинхронными и придумываете какое-то другое решение любой проблемы, заставляя думать, что она должна выполняться синхронно. И даже если вы все еще думаете, что это должно быть синхронным, убедитесь, что он не блокирует поток пользовательского интерфейса.

Смежные вопросы