为什么我的 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