【发布时间】:2017-04-13 13:26:50
【问题描述】:
我有一个 singleton 类:
class Database {
static let instance:Database = Database()
private var db: Connection?
private init(){
do {
db = try Connection("\(path)/SalesPresenterDatabase.sqlite3")
}catch{print(error)}
}
}
现在我使用 Database.instance.xxxxxx 访问该类以在该类中执行一个功能。但是,当我从另一个线程访问该实例时,它会抛出奇怪的结果,就好像它试图创建另一个实例一样。我应该在同一个线程中引用实例吗?
为了澄清奇怪的结果,显示由于两个实例尝试同时访问数据库而导致的数据库 I/O 错误
更新
有关数据库代码的更多信息,请参阅此问题:Using transactions to insert is throwing errors Sqlite.swift
【问题讨论】:
-
Swift 单例创建是线程安全的。这并不意味着您在单例实例中调用的函数将神奇地线程安全。如果您需要使函数线程安全,则需要使用信号量、串行调度队列或操作队列之类的东西
-
However when I access the instance from another thread it throws bizarre results as if its trying to create another instance我不这么认为,鉴于您的Database类的当前定义,您不能创建 2 个实例。但是,也许您没有显示该类中的更多代码。顺便说一句:对你的类的最后一个改进:你应该将它声明为final以防止子类化。 -
类中的附加代码显示了一个 addRow 函数。此函数在 alamofire 完成块中调用,然后在无法插入数据的地方抛出错误。有趣的是,如果我删除对我的 Database.instance 的所有调用。单例并让有问题的代码先运行它,它会正常工作...
-
有关数据库代码的更多信息,请参阅此问题:stackoverflow.com/questions/43388443/…
-
@RichardThompson 你可以使用 FMDB 并使用他的
FMDatabaseQueue线程安全地访问你的数据库
标签: ios swift swift3 singleton