为什么我的 sqlite 调用同时在不同的线程上?
Why are my sqlite calls on separate threads at the same time?
我在 https://github.com/AaronBratcher/ALBNoSQLDB 有一个 class,我试图确保它是线程安全的。 Sqlite 要求一次只能由 1 个线程进行调用。
我有一个名为 _dbQueue 的队列
private let _dbQueue = dispatch_queue_create("com.AaronLBratcher.ALBNoSQLDBQueue", nil)
然后我在此队列上同步打开数据库
...
var openDBSuccessful = true
//create task closure
let openFile:() = {
openDBSuccessful = self.openDBFile(dbFilePath)
}()
dispatch_sync(_dbQueue) {
openFile
}
...
我也在同一个队列上运行同步命令和查询
private func sqlExecute(sql:String)->Bool {
var successful = true
//create task closure
let command:() = {
successful = self.runCommand(sql)
}()
dispatch_sync(_dbQueue) {
command
}
return successful
}
func sqlSelect(sql:String)->[DBRow]? { // DBRow is an array of AnyObject
var recordset:[DBRow]?
let query:() = {
recordset = self.runSelect(sql)
}()
dispatch_sync(_dbQueue) {
query
}
return recordset
}
然而,在做一些测试时,我得到了这个。两个单独的线程 运行 同时使用 sqlite。我该如何避免这种情况发生?
SQLite 命令需要 运行 在同一线程上。这可以通过两种方式完成:
a) 运行 在主线程上
b) 子类 NSThread 和 运行 你的 SQLite 命令在那里
从任何给定队列(主队列除外)调度,不保证块将在同一线程上执行。
为了解决这个问题,我选择了选项 b。代码可以在这里找到:https://github.com/AaronBratcher/ALBNoSQLDB
我在 https://github.com/AaronBratcher/ALBNoSQLDB 有一个 class,我试图确保它是线程安全的。 Sqlite 要求一次只能由 1 个线程进行调用。
我有一个名为 _dbQueue 的队列
private let _dbQueue = dispatch_queue_create("com.AaronLBratcher.ALBNoSQLDBQueue", nil)
然后我在此队列上同步打开数据库
...
var openDBSuccessful = true
//create task closure
let openFile:() = {
openDBSuccessful = self.openDBFile(dbFilePath)
}()
dispatch_sync(_dbQueue) {
openFile
}
...
我也在同一个队列上运行同步命令和查询
private func sqlExecute(sql:String)->Bool {
var successful = true
//create task closure
let command:() = {
successful = self.runCommand(sql)
}()
dispatch_sync(_dbQueue) {
command
}
return successful
}
func sqlSelect(sql:String)->[DBRow]? { // DBRow is an array of AnyObject
var recordset:[DBRow]?
let query:() = {
recordset = self.runSelect(sql)
}()
dispatch_sync(_dbQueue) {
query
}
return recordset
}
然而,在做一些测试时,我得到了这个。两个单独的线程 运行 同时使用 sqlite。我该如何避免这种情况发生?
SQLite 命令需要 运行 在同一线程上。这可以通过两种方式完成:
a) 运行 在主线程上
b) 子类 NSThread 和 运行 你的 SQLite 命令在那里
从任何给定队列(主队列除外)调度,不保证块将在同一线程上执行。
为了解决这个问题,我选择了选项 b。代码可以在这里找到:https://github.com/AaronBratcher/ALBNoSQLDB