我在https://github.com/AaronBratcher/ALBNoSQLDB有一个课,我试图确保线程安全。 Sqlite要求一次只能调用一个线程。
我有一个名为_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。我如何防止这种情况发生?
答案 0 :(得分:0)
SQLite命令需要在同一个线程上运行。这可以通过两种方式实现:
a)在主线程上运行
b)子类NSThread并在那里运行SQLite命令
从主队列以外的任何给定队列调度,并不能保证在同一个线程上执行块。
为了解决这个问题,我选择了选项b。代码可以在这里找到:https://github.com/AaronBratcher/ALBNoSQLDB