gpt4 book ai didi

sqlite - 为什么我的 sqlite 调用同时在不同的线程上?

转载 作者:搜寻专家 更新时间:2023-11-01 05:41:25 24 4
gpt4 key购买 nike

我在 https://github.com/AaronBratcher/ALBNoSQLDB 上课我试图确保线程安全。 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。我该如何避免这种情况发生?

exception error shown with stack

最佳答案

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

a) 在主线程上运行

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

从任何给定队列(主队列除外)调度,并不能保证 block 将在同一线程上执行。

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

关于sqlite - 为什么我的 sqlite 调用同时在不同的线程上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com