为什么我的sqlite同时调用单独的线程?

时间:2015-04-21 16:20:55

标签: sqlite swift thread-safety

我在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。我如何防止这种情况发生?

exception error shown with stack

1 个答案:

答案 0 :(得分:0)

SQLite命令需要在同一个线程上运行。这可以通过两种方式实现:

a)在主线程上运行

b)子类NSThread并在那里运行SQLite命令

从主队列以外的任何给定队列调度,并不能保证在同一个线程上执行块。

为了解决这个问题,我选择了选项b。代码可以在这里找到:https://github.com/AaronBratcher/ALBNoSQLDB